222

在我的一个项目源文件中,我找到了这个 C 函数定义:

int (foo) (int *bar)
{
    return foo (bar);
}

注意: 旁边没有星号foo,所以它不是函数指针。或者是吗?递归调用在这里发生了什么?

4

3 回答 3

338

在没有任何预处理器的情况下,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 */
}

您的函数看起来几乎与上面相同,所以我怀疑这也是您的代码中发生的事情。

于 2012-11-28T08:30:46.817 回答
38

括号不会更改声明 - 它仍然只是定义一个名为foo.

使用它们的原因几乎可以肯定是因为有一个类似函数的宏叫做foo定义:

#define foo(x) ...

在函数声明中使用(foo)可防止此宏在此处展开​​。因此,可能发生的情况是,foo()正在定义一个函数,其主体从类函数宏扩展而来foo

于 2012-11-28T08:34:20.957 回答
-3

括号没有意义。
您显示的代码不过是无限递归。

在定义函数指针时,您有时会看到奇怪的括号,它们确实意味着什么。但这里不是这种情况。

于 2012-11-28T08:30:34.393 回答