void (assert)(int e)
{
assert(e);
}
这是如何运作的?
答案 0 :(得分:3)
void (assert)(int e)
相当于void assert(int)
你为什么需要它?
考虑以下示例
#include<stdio.h>
void foo(int a)
{
printf("%d", a);
}
#define foo(a) {/*I do nothing*/}
int main()
{
foo(5); // won't call `foo`
}
如何调用foo
,调用它的函数而不是在调用地点替换的宏定义?
解决方案是添加一个额外的括号,如(foo)(5)
类似地,已知assert
是一个宏。这就是我能想到的原因。
答案 1 :(得分:2)
由于assert
已被定义为函数式宏,如果没有括号,它将在函数头和正文中扩展两者。
例如:
#define twice(x) ((x)+(x))
void twice(int i)
{
return twice(i);
}
将扩展到以下,这显然不合法
void ((int i)+(int i))
{
return ((i)+(i));
}
另一方面:
#define twice(x) ((x)+(x))
void (twice)(int i)
{
return twice(i);
}
将扩展为:
void (twice)(int i)
{
return ((i)+(i));
}
编译器会忽略函数名称周围的额外括号。
这是标准库源代码中经常使用的常用技巧,在其他可能存在具有相同名称的函数和宏的上下文中。
答案 2 :(得分:1)
这是合法的语法,只需用额外的括号来编写它。你这样做的原因是因为assert()
通常被定义为一个宏;所以上面的函数存在使assert()
成为一个真正的函数,可能因此你可以在其中设置一个断点。