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