gpt4 book ai didi

c - 将宏参数传递给宏函数

转载 作者:行者123 更新时间:2023-12-03 23:55:53 26 4
gpt4 key购买 nike

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

#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));

最佳答案

解析宏调用时,不会扩展宏参数。解析宏调用后,宏定义文本中宏参数的每次使用都将替换为宏扩展参数,但与 # 一起使用的宏参数除外。或 ##操作(字符串化和标记粘贴),它们被宏参数的未扩展文本替换。然后是###操作,然后整个宏体再扫描一次。

结果是SUM(FOO, a)解析 aa 有两个参数。由于宏需要三个,因此无法编译。

在某种程度上,您可以通过使用一个额外的宏扩展级别来解决这个问题:

#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 终止输出行。 .除此以外:
  • 该行可能不会立即写入。在发送换行符之前,行缓冲输出实际上不会发送到输出设备/文件。
  • 如果程序是一个控制台应用程序并且它在没有正确关闭的情况下终止 stdout , 你会发现自己在最后一个输出行输入下一个 shell 命令。这往往会混淆像 readline 这样的行编辑输入库。 .
  • 关于c - 将宏参数传递给宏函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47615345/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com