宏foo的意义(a,b ,;)

时间:2012-09-08 16:34:32

标签: c macros

我在我的公司经历了一些旧的C代码,它是在没有gcc -flags选项的情况下编译的,我遇到了一段奇怪的代码。

#define foo(a,b) foonew(a,b, ;)

任何人都可以向我解释这是做什么的吗?

编辑: 因为它是未使用gcc -flags编译的大型代码库的一部分,所以我无法看到预处理的form.Compilation是否成功完成而没有错误或警告。

2 个答案:

答案 0 :(得分:1)

分号用作预处理令牌,就像ab一样。它可以用作另一个宏的参数。

例如

#define foonew(x,y,z)   (x + y) z

#define foo(a,b)    foonew(a,b, ;)

int main()
{
   int one = 1;
   int two = 2;

   int three = foo(one, two)   // no semicolon here!

    return three;

}

答案 1 :(得分:0)

这将有效

 #define foo(a,b) foonew(a,b)

试试这个。

宏参数可以为空(由零预处理标记组成)。例如,

 #define SUM(a,b,c) a + b + c
  SUM(1,,3)  /* No error message.

1代替a,3代替c。 * / 如果标识符列表不以省略号结尾,则宏调用中的参数数量必须与相应宏定义中的参数数量相同。在参数替换期间,在所有指定参数被替换之后剩余的任何参数(包括任何分隔逗号)被组合成一个称为变量参数的参数