在我的一个项目源文件中,我发现了这个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展开的。