在我的一个项目源文件中,我发现了这个C函数定义:
int (foo) (int *bar)
{
return foo (bar);
}
注意:foo旁边没有星号,所以它不是一个函数指针。真的是这样吗? 这里递归调用发生了什么?
在我的一个项目源文件中,我发现了这个C函数定义:
int (foo) (int *bar)
{
return foo (bar);
}
注意:foo旁边没有星号,所以它不是一个函数指针。真的是这样吗? 这里递归调用发生了什么?
在没有任何预处理器的情况下,foo的签名相当于
int foo (int *bar)
我唯一见过人们在函数名周围加上看似不必要的圆括号的情况是,同时存在同名的函数和类函数宏,而程序员希望阻止宏展开。
这种做法乍一看可能有点奇怪,但C库通过提供一些具有相同名称的宏和函数开创了先例。
isdigit()就是这样一个函数/宏对。标准库可以这样定义它:
/* the macro */
#define isdigit(c) ...
/* the function */
int (isdigit)(int c) /* avoid the macro through the use of parentheses */
{
return isdigit(c); /* use the macro */
}
您的函数看起来几乎与上面的相同,所以我怀疑这也是代码中发生的事情。
parantheses并没有改变声明——它仍然只是定义了一个名为foo的普通函数。
使用它们的原因几乎可以肯定是因为有一个类似函数的宏被定义为foo:
#define foo(x) ...
在函数声明中使用(foo)可以防止在此处展开这个宏。因此,可能发生的情况是,函数foo()被定义时,其主体是从类似函数的宏foo展开的。