我在我的公司经历了一些旧的C代码,它是在没有gcc -flags
选项的情况下编译的,我遇到了一段奇怪的代码。
#define foo(a,b) foonew(a,b, ;)
任何人都可以向我解释这是做什么的吗?
编辑:
因为它是未使用gcc -flags
编译的大型代码库的一部分,所以我无法看到预处理的form.Compilation
是否成功完成而没有错误或警告。
答案 0 :(得分:1)
分号用作预处理令牌,就像a
和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;
}
答案 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。 * / 如果标识符列表不以省略号结尾,则宏调用中的参数数量必须与相应宏定义中的参数数量相同。在参数替换期间,在所有指定参数被替换之后剩余的任何参数(包括任何分隔逗号)被组合成一个称为变量参数的参数