将宏参数传递给宏函数

如何将宏参数和另一个整型变量一起传递给宏函数? 将宏参数传递给宏函数

#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线。否则:

  1. 该行可能不会立即写入。在发送换行符之前,行缓冲输出实际上不会发送到输出设备/文件。

  2. 如果程序是一个控制台应用程序,并且在没有正确关闭的情况下终止stdout,您会发现自己正在键入下一个shell命令,如果是最后一个输出行。这往往会混淆线路编辑输入库,如readline

以上是 将宏参数传递给宏函数 的全部内容, 来源链接: utcz.com/qa/259528.html

回到顶部