我在我的項目中使用了一個結構z的一些代碼段。此結構聲明根據我的系統中設置的條件標誌而變化。我希望結構聲明是動態的。動態結構聲明
如果條件標誌爲0,那麼,
struct x z;
如果條件標誌是1,那麼,
struct y z;
但操作被在z執行將是相同的。目前,這是通過聲明兩個結構處理:
struct x z_x;
struct y z_y;
然後按照所述條件標誌使用適當的結構中的代碼。這種方法似乎不是最佳的。有關處理這種類型的代碼的任何建議?
我在我的項目中使用了一個結構z的一些代碼段。此結構聲明根據我的系統中設置的條件標誌而變化。我希望結構聲明是動態的。動態結構聲明
如果條件標誌爲0,那麼,
struct x z;
如果條件標誌是1,那麼,
struct y z;
但操作被在z執行將是相同的。目前,這是通過聲明兩個結構處理:
struct x z_x;
struct y z_y;
然後按照所述條件標誌使用適當的結構中的代碼。這種方法似乎不是最佳的。有關處理這種類型的代碼的任何建議?
由於標誌被運行時,你無法避免檢查此標誌的所有時間。至少,我想不出這樣的方式。
但是你仍然可以減少內存和代碼。我會做這樣的:
爲了減少內存使用:
struct z_x* = NULL;
struct z_y* = NULL;
//...
if(flag)
{
z_x = malloc(sizeof(struct x));
}
else
{
z_y = malloc(sizeof(struct y));
}
要減少而不是寫所有的時間之類的代碼,:
if(flag)
{
// do operations_N with z_x
}
else
{
// do operations_N with z_y
}
我會寫:
operations_N(z_x, z_y, flag);
其中
void operations_N(struct x* z_x, struct y* z_y, flag)
{
if(flag)
{
// do operations_N with z_x
}
else
{
// do operations_N with z_y
}
}
當然,operations_1
和flag
應該有一些很好的和邏輯的名稱。
但是這可能會導致做了一些問題,所以要小心,如果你決定使用這種方法。
您還可以使用的#ifdefs創建結構:
typedef struct
{
#ifdef MY_FLAG
int s;
#else
float s;
#endif
} z;
您還可以使用聯盟,結構將在同一時間兩個字段,你將使用一個你需要的。
union {
int i;
float f;
} z;
z.i = 1; z.f = 1.0;
這樣,你應該一次只使用一個成員。
什麼是這個條件標誌,一個宏,已知的編譯時間? –
該條件標誌是運行時確定的。 – lxusr
你想實現什麼 - 使用更少的內存或僅僅只有一個變量,而不是每次都檢查該標誌?對於第二個 - 我想不出一種方法來避免這種情況。 –