将数组文字作为宏参数传递

Lie*_*yan 14 c c-preprocessor

这已经困扰了我一段时间,例如,如果我正在尝试编写这段代码:

// find the length of an array
#define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof(int))   
// declare an array together with a variable containing the array's length
#define ARRAY(name, arr) int name[] = arr; size_t name##_length = ARRAY_LENGTH(name);

int main() {
    ARRAY(myarr, {1, 2, 3});
}
Run Code Online (Sandbox Code Playgroud)

代码给出了这个错误:

<stdin>:8:31: error: macro "ARRAY" passed 4 arguments, but takes just 2
Run Code Online (Sandbox Code Playgroud)

因为它看作ARRAY(myarr, {1, 2, 3});传递ARRAY参数myarr,{12,和3}.有没有办法将数组文字传递给宏?

编辑:在一些较复杂的宏,我需要的,我可能还需要两个或更多的数组传递给宏,所以可变参数宏不起作用.

Jen*_*edt 28

是的,这{}不是预处理器的括号.您可以通过虚拟宏来保护参数

#define P99_PROTECT(...) __VA_ARGS__ 
ARRAY(myarr, P99_PROTECT({1, 2, 3}));
Run Code Online (Sandbox Code Playgroud)

应该适合你的情况.通过这个你有一个第一级()保护,被解释为参数分隔符.这些()宏调用然后在扩展时消失.

请参阅此处了解更多用于执行语句展开的复杂宏.