[英]Dynamically use a structure in c
在我的代碼中有多個結構,如結構_1、結構_2、結構_3等。我正在嘗試編寫一個宏,它將使我能夠 select 正確的結構(select 的結構基於另一個值)。 我不能透露確切的代碼......但它類似於這個
#include <stdio.h>
#define concat(X,Y) X##_##Y
#define typename(X){\
if(val==0)\
concat(X,1)\
else\
concat(X,2)\
}
int val;
typedef struct {
int x;
char c;
}structure_1;
typedef struct {
int y;
char c;
}structure_2;
int main() {
val = 0;
typename(structure) abc;
abc.x = 0;
printf("%d\n",abc.x);
}
這不起作用並且會出現問題
24 11 E:\DEV\concat.c [Error] expected expression before 'structure_1'
3 22 E:\DEV\concat.c [Note] in definition of macro 'concat'
24 2 E:\DEV\concat.c [Note] in expansion of macro 'typename'
25 2 E:\DEV\concat.c [Error] 'abc' undeclared (first use in this function)
25 2 E:\DEV\concat.c [Note] each undeclared identifier is reported only once for each function it appears in
使用 if-else 語句是一種選擇,但它必須在許多結構和許多地方完成,所以我想避免這種情況。 請建議我做錯了什么或任何其他方式。
您的宏不起作用的原因是它導致if (val == 0) structure_1;
它不會編譯,因為你沒有聲明一個變量。 abc
部分沒有注入到宏中,所以它只出現在已處理的宏擴展的末尾: abc
只被聲明為structure_2
的變量。
這很容易解決:您還必須將變量名稱作為宏的參數。 這樣做並且......現在這一點顯然已經被破壞了,因為你的變量只存在於 if-else 塊中,這是你不想要的。
在這一點上,很明顯這根本不是 C 的工作原理。 泛型沒有得到很好的支持,這是一件好事,因為泛型與 C 作為一種語言試圖實現的目標無關。 你應該問問自己為什么要強迫語言以這種方式表現。 您嘗試做的事情有什么意義?
無論如何,從某種意義上說,有一種方法可以解決這個問題:工會。 聯合允許您基本上將不同的類型組合成一種類型。 這有一個明顯的缺點,即強制從聯合聲明的變量始終是最大類型的大小。 如果你從一個 1 字節的 char 和一個 100 字節的結構體中創建一個聯合,則聲明的每個變量將總是消耗 100 字節。 另一方面,如果您將相同大小的結構拼湊在一起,則沒有特別的懲罰。
一個簡單的演示:
struct t {
union {
int x; float y;
};
};
int main() {
struct t a = {0};
printf("%d\n", a.x);
printf("%d\n", a.y);
printf("%d\n", sizeof(a)); // 4
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.