如何将宏参数与另一个整数变量一起传递给宏函数?
#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));
答案 0 :(得分:1)
解析宏调用时,不会展开宏参数。在解析宏调用之后,宏定义文本中宏参数的每次使用都被宏扩展参数替换,除了与# this should have a module reference to your root's main.tf such as:
module "vpc" {
source = "source = "../../.."
env = "prod"
aws_account_id = "************"
}
或#
操作一起使用的宏参数(stringify和token) paste),用宏参数的未扩展文本替换。然后执行##
和#
操作,然后再扫描整个宏体。
结果是##
被解析为有两个参数。由于宏需要三个,所以不能编译。
通过使用一个额外的宏扩展级别,您可以在某种程度上解决这个问题:
SUM(FOO, a)
现在,在重新扫描替换文本之前,将扩展使用#define CALL(macro, ...) macro(__VA_ARGS__)
printf("\nMacro Sum: %d", CALL(SUM, FOO, a));
参数(恰好是varargs参数,尽管这对扩展顺序没有任何影响),因此__VA_ARGS__
将使用三个参数调用。
顺便说一下,在输出行的开头输出换行符是一个坏习惯,会让你有一天陷入困境。输出行应该在行尾有一个换行符:
FOO
还通过在开头添加换行符预先写一个空行也没有错,但无论如何,你应该几乎总是使用printf("Macro Sum: %d\n", CALL(SUM, FOO, a));
终止outpur行。否则:
可能不会立即写入该行。在发送换行符之前,行缓冲输出实际上不会发送到输出设备/文件。
如果程序是一个控制台应用程序并且它在没有正确关闭\n
的情况下终止,那么如果最后一个输出行,你会发现自己输入了下一个shell命令。这往往会混淆行编辑输入库,如stdout
。
答案 1 :(得分:0)
单宏参数可行:
#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