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

use*_*094 213 c function parentheses

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

int (foo) (int *bar)
{
    return foo (bar);
}
Run Code Online (Sandbox Code Playgroud)

注意:旁边没有星号foo,因此它不是函数指针.或者是吗?递归调用会发生什么?

NPE*_*NPE 329

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

int foo (int *bar)
Run Code Online (Sandbox Code Playgroud)

我看到人们在函数名称周围放置看似不必要的括号的唯一上下文是当函数和类似函数的宏都具有相同的名称时,程序员想要阻止宏扩展.

这个实践起初看起来有点奇怪,但是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 */
}
Run Code Online (Sandbox Code Playgroud)

你的功能看起来几乎与上面的相同,所以我怀疑这也是你的代码中发生的事情.

  • @ user1859094宏扩展确实发生在括号内,但只有当下一个标记是左括号(C99,6.10.3§10)时才会扩展类函数宏,因此`foo(int*bar)`会得到替换,但不是`(foo)(int*bar)`(`foo`之后的下一个标记是`)`) (78认同)
  • @ user1859094:再看看,几乎可以肯定你的代码中正在发生的事情.函数内部的`foo(bar)`使用相应的宏. (13认同)
  • 如何调用这样的函数?你也可以用括号来称呼它吗?例如,这会工作:`(isdigit)(5)`? (4认同)
  • @Greg:是的,这就是你的称呼方式. (4认同)
  • 这也可能就是这种情况; 我没有寻找宏......而且我不知道宏括号内的宏扩展不会发生,谢谢你指出这一点! (2认同)

caf*_*caf 37

parantheses不会改变声明 - 它仍然只是定义一个名为的普通函数foo.

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

#define foo(x) ...
Run Code Online (Sandbox Code Playgroud)

使用(foo)函数声明防止这里被扩展这个宏.所以可能发生的事情是foo()正在定义一个函数,它的主体从类似函数的宏扩展foo.

  • @MichaelBurr,也可以选择不具有相同名称的宏和函数.我知道你不能总是控制一切,但如果你达成了这个解决方案,我会说一些事情是非常错误的. (7认同)
  • 很好的扣除(虽然为此目的使用括号应受到法律惩罚). (5认同)
  • @ugoren:在函数名称周围使用parens是阻止类函数宏的宏扩展的唯一方法.有时它是必要的工具. (3认同)