Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将宏参数传递给宏函数_C_Function_Macros_Arguments_Parameter Passing - Fatal编程技术网

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

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

  • 如果该程序是一个控制台应用程序,并且在未正确关闭stdout的情况下终止,则您将发现自己在最后一行的末尾键入下一个shell命令。这往往会混淆行编辑输入库,如
    readline


  • 使用
    SUM(FOO,a)
    展开该行时,
    FOO
    在确定参数之前不会展开。只有2个参数,但宏需要3个参数-因此会显示消息。接下来将
    FOO
    扩展为
    1,2
    printf("Macro Sum: %d\n", CALL(SUM, FOO, a));