在我的一个项目源文件中,我找到了这个C函数定义:
int (foo) (int *bar)
{
return foo (bar);
}
注意:foo
旁边没有星号,因此它不是函数指针。或者是吗?
递归调用会发生什么?
答案 0 :(得分:329)
在没有任何预处理器的情况下,foo
的签名相当于
int foo (int *bar)
我看到人们在函数名称周围放置看似不必要的括号的唯一上下文是当函数和类似函数的宏都有相同的名称时,程序员想要阻止宏扩展。
这种做法起初看起来有点奇怪,但C库开创了先例providing some macros and functions with identical names。
一个这样的函数/宏对是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 */
}
您的功能看起来几乎与上面的相同,所以我怀疑这也是您的代码中发生的事情。
答案 1 :(得分:37)
parantheses不会更改声明 - 它仍然只是定义一个名为foo
的普通函数。
它们被使用的原因几乎可以肯定是因为有一个类似于函数的宏foo
被定义:
#define foo(x) ...
在函数声明中使用(foo)
可以防止在此处展开此宏。所以可能发生的事情是定义一个函数foo()
,它的主体从类似函数的宏foo
扩展。
答案 2 :(得分:-3)
括号没有意义 你展示的代码只是一个无限的递归。
定义函数指针时,有时会看到奇怪的括号。但这不是这种情况。