将宏参数传递给宏函数
如何将宏参数和另一个整型变量一起传递给宏函数? 将宏参数传递给宏函数
#define SUM(X, Y, Z) X + Y + Z #define FOO 1, 2
void print(int a, int b)
{
printf("Sum: %d", a + b);
}
int main(void)
{
// Normal function works as expected
print(FOO);
// Macro function not working
int a = 3;
printf("\nMacro Sum: %d", SUM(FOO, a));
return 0;
}
我期望的输出是:
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
回答:
当宏分析被解析时,宏参数不会被扩展。在宏调用被分析之后,宏定义文本中的每个宏参数的使用都将被宏扩展参数替代,除了与#
或##
操作(stringify和令牌粘贴)一起使用的宏参数(用参数宏观参数的未扩展文本。然后执行#
和##
操作,然后再次扫描整个宏体。
结果是SUM(FOO, a)
被解析为有两个参数。由于宏需要三个,所以不会编译。
可以解决这个问题,在一定程度上,通过使用宏扩展的一个额外的级别:
#define CALL(macro, ...) macro(__VA_ARGS__) printf("\nMacro Sum: %d", CALL(SUM, FOO, a));
现在使用__VA_ARGS__
参数(这恰好是一个可变参数的参数,虽然这使得绝对的与扩展顺序没有什么区别)将在替换文本重新扫描之前展开,因此将使用三个参数调用FOO
。
顺便说一句,在输出的输出行的开头一个换行符是一个坏习惯,这将让你陷入困境的一天。输出线应该有一个换行符在该行的末尾:
printf("Macro Sum: %d\n", CALL(SUM, FOO, a));
这没有什么错也写一个空行预先放一个换行符在最开始也就是,但无论如何,你应该总是用\n
终止outpur线。否则:
该行可能不会立即写入。在发送换行符之前,行缓冲输出实际上不会发送到输出设备/文件。
如果程序是一个控制台应用程序,并且在没有正确关闭的情况下终止
stdout
,您会发现自己正在键入下一个shell命令,如果是最后一个输出行。这往往会混淆线路编辑输入库,如readline
。
以上是 将宏参数传递给宏函数 的全部内容, 来源链接: utcz.com/qa/259528.html