此宏中发生了什么?我知道#test将此参数扩展为文字文本。但是pre;
和test;
的作用是什么?
#define MACRO_FN(test, pre, repeat, size) \
do { \
printf("%s: ", #test); \
for (int i = 0; i < repeat; i++) { \
pre; \
test; \
} \
} while (0)
这样使用
MACRO_FN(a_func(an_array, size),, var1, size);
双重逗号在这里是什么意思?
答案 0 :(得分:3)
pre
和test
似乎是两个功能。
根据其编写方式,我们可以猜测pre
是在test
之前调用的函数。
双逗号没有特殊含义。只是因为这里省略了第二个参数(pre
)。
编辑:作为旁注,如@Lundin所说,这种宏“应该避免像瘟疫一样”。
答案 1 :(得分:3)
这是一个最小的示例:
#define repeat 5 // I added this, because 'repeat' is not mentionned in your question
#define MACRO_FN(test, pre, var1, size) \
do { \
printf("%s: ", #test); \
for (int i = 0; i < repeat; i++) { \
pre; \
test; \
} \
} while (0)
void foo()
{
}
void func(int a, int b)
{
}
int main()
{
MACRO_FN(func(2, 3), foo(), var1, size);
}
经过预处理后,代码与此等效:
int main()
{
printf("%s: ", "func(2,3)");
for (int i = 0; i < 5; i++)
{
foo();
func(2, 3);
}
}
因此,该宏是一个包装器,该包装器将输出函数名称及其参数,并由宏调用,并执行第一个参数repeat
次(无论repeat
是)执行的功能。如果省略第二个参数,则具有该名称的函数很简单,不会在前面提到的函数之前被调用,如以下示例所示:
int main()
{
MACRO_FN(func(2, 3),, var1, size);
}
经过预处理后,代码与此等效:
int main()
{
printf("%s: ", "func(2,3)");
for (int i = 0; i < 5; i++)
{
;
func(2, 3);
}
}
注意:
为简便起见,我从等效程序中删除了do while(0)
,请阅读this SO article以获取更多信息: