-5

我在公司里浏览了一些旧的 C 代码,这些代码是在没有gcc -flags选项的情况下编译的,我遇到了一行奇怪的代码。

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

谁能向我解释这是做什么的?

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

4

2 回答 2

1

分号用作预处理标记,就像aand一样b。它可以用作另一个宏的参数。

例如

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

}
于 2012-11-24T12:58:26.370 回答
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。*/ 如果标识符列表不以省略号结尾,则宏调用中的参数个数必须与相应宏定义中的参数个数相同。在参数替换期间,所有指定参数被替换后剩余的任何参数(包括任何分隔逗号)都组合成一个参数,称为变量参数

于 2012-09-08T17:07:21.907 回答