2012-08-23 57 views
1

我在我的項目中使用了一個結構z的一些代碼段。此結構聲明根據我的系統中設置的條件標誌而變化。我希望結構聲明是動態的。動態結構聲明

如果條件標誌爲0,那麼,

struct x z; 

如果條件標誌是1,那麼,

struct y z; 

但操作被在z執行將是相同的。目前,這是通過聲明兩個結構處理:

struct x z_x; 
struct y z_y; 

然後按照所述條件標誌使用適當的結構中的代碼。這種方法似乎不是最佳的。有關處理這種類型的代碼的任何建議?

+0

什麼是這個條件標誌,一個宏,已知的編譯時間? –

+0

該條件標誌是運行時確定的。 – lxusr

+0

你想實現什麼 - 使用更少的內存或僅僅只有一個變量,而不是每次都檢查該標誌?對於第二個 - 我想不出一種方法來避免這種情況。 –

回答

0

由於標誌被運行時,你無法避免檢查此標誌的所有時間。至少,我想不出這樣的方式。

但是你仍然可以減少內存和代碼。我會做這樣的:


爲了減少內存使用:

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_1flag應該有一些很好的和邏輯的名稱。

但是這可能會導致做了一些問題,所以要小心,如果你決定使用這種方法。

1

您還可以使用的#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;

這樣,你應該一次只使用一個成員。