在我的一个项目源文件中,我找到了这个 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 */
}
您的函数看起来几乎与上面相同,所以我怀疑这也是您的代码中发生的事情。
括号不会更改声明 - 它仍然只是定义一个名为foo
.
使用它们的原因几乎可以肯定是因为有一个类似函数的宏叫做foo
定义:
#define foo(x) ...
在函数声明中使用(foo)
可防止此宏在此处展开。因此,可能发生的情况是,foo()
正在定义一个函数,其主体从类函数宏扩展而来foo
。
括号没有意义。
您显示的代码不过是无限递归。
在定义函数指针时,您有时会看到奇怪的括号,它们确实意味着什么。但这里不是这种情况。