为什么用括号括起函数?

我展示了一些我明白的代码。

以下代码是示例代码。

static void (_func)(int p); int main() { .... _func(3); .... } static void (_func)(int p) { .... } 

一般我知道用括号括起来的函数用’*’作为函数指针(* _func),但是上面代码为什么在函数声明时用括号括起函数?

有什么理由使用这种方法吗?

在函数名称周围放置parens将阻止它被具有相同名称的类似函数的宏“覆盖”。

例如,有时函数可能被实现为宏,但它也可能需要实现为实际函数(一个原因可能是可以获得指向它的指针)。 此API的实现者可能会将函数名称和实际函数实现的声明与包含在parens中的名称放在一起,这样就不会与宏名称冲突。

然后,API的用户可以决定,无论出于何种原因,他们想要使用实际函数而不是宏,他们可以#undef _func或使用包含在parens中的函数名来避免使用宏。

如C99 7.1.4“库函数的使用”中所述:

标头中声明的任何函数可以另外实现为标头中定义的类函数宏,因此如果在包含标头时显式声明了库函数,则可以使用下面显示的技术之一来确保声明不是受到这样一个宏观的影响。 通过将函数的名称括在括号中,可以在本地抑制函数的任何宏定义,因为该名称后面没有左括号,后面表示宏函数名称的扩展。 出于相同的语法原因,即使它也被定义为宏,也允许获取库函数的地址。 使用#undef删除任何宏定义也将确保引用实际函数。