C预处理器初始化数组

标签 c c-preprocessor

我正在编写一个复杂的宏,我还需要传递数组初始值设定项。基本上我很难做到:

#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/

相关文章:

python - python 和 C 代码混合有什么好的引用吗?

c++ - 为特定文件定义

macros - 如何将 C 预处理器宏与 Rust 的 FFI 一起使用?

c - 如何使用预处理器缩短这些行?

c - access() 说文件存在但 fopen() 说它不存在

c - 当直接使用fputs在文件中写入字符数组时,会存储不同格式的文本

c++ - 如何禁用 boost::wave 的部分概念检查?

c++ - GCC 的 _Pragma 运算符中的预处理器标记粘贴

C函数中的自赋值

c - 为什么这个函数在释放内存时总是崩溃?