函数名称的圆括号是什么意思?

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

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

注意: foo旁边没有星号,所以不是函数指针。 还是呢? 在recursion调用中发生了什么?

在没有任何预处理器的情况下, foo的签名相当于

 int foo (int *bar) 

我看到人们在函数名称周围放置一些看似不必要的括号的唯一的上下文是当同时存在函数和类似函数的macros时,程序员想要防止macros扩展。

这种做法一开始可能有些奇怪,但C库提供了一些具有相同名称的macros和函数的先例。

一个这样的函数/macros对是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

他们之所以被使用的原因几乎是肯定的,因为有一个函数式的macros定义为foo

 #define foo(x) ... 

在函数声明中使用(foo)可以防止这个macros在这里被展开。 所以可能发生的事情是,函数foo()正在被定义,它的正文从函数式的macrosfoo被扩展。

括号是毫无意义的。
你显示的代码只是无限的recursion。

定义一个函数指针时,有时会看到奇怪的圆括号, 但是,这不是这种情况。