将宏参数传递给宏函数

时间:2017-12-03 04:46:40

标签: c function macros arguments parameter-passing

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

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

2 个答案:

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

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

  2. 如果程序是一个控制台应用程序并且它在没有正确关闭\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