C 将宏参数传递给宏函数
如何将宏参数和另一个整数变量一起传递给宏函数? 我预计产出为:C 将宏参数传递给宏函数,c,function,macros,arguments,parameter-passing,C,Function,Macros,Arguments,Parameter Passing,如何将宏参数和另一个整数变量一起传递给宏函数? 我预计产出为: Sum: 3 Macro Sum: 6 但是,我得到以下错误: main.c:18:41: error: macro "SUM" requires 3 arguments, but only 2 given printf("\nMacro Sum: %d", SUM(FOO, a)); 单个宏参数将起作用: #define SUM(X, Y, Z) X + Y + Z #define FOO1 (1) #def
Sum: 3
Macro Sum: 6
但是,我得到以下错误:
main.c:18:41: error: macro "SUM" requires 3 arguments, but only 2 given
printf("\nMacro Sum: %d", SUM(FOO, a));
单个宏参数将起作用:
#define SUM(X, Y, Z) X + Y + Z
#define FOO1 (1)
#define FOO2 (2)
void print(int a, int b)
{
printf("Sum: %d", a + b);
}
int main(void)
{
// Normal function works as expected
print(FOO1,FOO2);
int a = 3;
printf("\nMacro Sum: %d", SUM(FOO1, FOO2, a));
return 0;
}
输出:
Sum: 3
Macro Sum: 6
分析宏调用时,不会展开宏参数。解析宏调用后,宏定义文本中宏参数的每次使用都将替换为宏扩展参数,但与
#
或#
操作(字符串化和标记粘贴)一起使用的宏参数除外,这些宏参数将替换为宏参数的未扩展文本。然后执行#
和##
操作,然后再次扫描整个宏体
结果是,SUM(FOO,a)
被解析为具有两个参数的aa。由于宏需要三个,因此无法编译
在某种程度上,您可以通过使用一个额外级别的宏扩展来解决此问题:
#define CALL(macro, ...) macro(__VA_ARGS__)
printf("\nMacro Sum: %d", CALL(SUM, FOO, a));
现在,在重新扫描替换文本之前,将扩展\uu VA\u ARGS\uu
参数(它恰好是一个varargs参数,尽管这对扩展顺序没有任何影响),因此将使用三个参数调用FOO
顺便说一下,在输出行的开头输出换行符是一个坏习惯,总有一天会给你带来麻烦。输出行的末尾应该有一个换行符:
printf("Macro Sum: %d\n", CALL(SUM, FOO, a));
通过在开头加一个换行符,预先写一个空行也没有什么错,但是无论如何,您应该总是用\n
终止outpur行。否则:
readline
使用
SUM(FOO,a)
展开该行时,FOO
在确定参数之前不会展开。只有2个参数,但宏需要3个参数-因此会显示消息。接下来将FOO
扩展为1,2
。
printf("Macro Sum: %d\n", CALL(SUM, FOO, a));