我正在编写一个复杂的宏,我还需要传递数组初始值设定项。基本上我很难做到:
#define INIT_ARR(VAR_NAME,ARR_DATA) int VAR_NAME[] = ARR_DATA
那我就叫它
INIT_ARR(myNm,{1,2,3});
但是预处理器将任何逗号(也是花括号内的逗号)解释为新的宏参数,所以它给我错误:
error: #55-D: too many arguments in invocation of macro "INIT_ARR"
预处理器不会忽略 () 所以我可以这样做:
#define INIT_ARR(VAR_NAME,ARR_DATA) int VAR_NAME[] = {ARR_DATA}
INIT_ARR(myNm,(1,2,3));
但随后它被解释为
int myNm[] = {(1,2,3)};
这对 C 来说是不正确的。
有什么办法吗?例如从参数中删除大括号?
最佳答案
我想我破解了它:
#define myArgs(...) __VA_ARGS__
#define INIT_ARR(VAR_NAME,ARR_DATA) int VAR_NAME[] = {myArgs ARR_DATA}
INIT_ARR(myArr,(1,2,3,4));
将被正确解释为:
int myArr[] = {1,2,3,4};
annoying_squid's answer帮我弄明白了...
关于C预处理器初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45325410/