在C中调用函数而不是宏

boo*_*shq 6 c macros

我的问题是:如果你有一个宏和一个具有相同名称的函数,只会调用宏,对吧?如果我想调用函数而不是宏,该怎么办?

jam*_*lin 12

如果你有一个函数和类似函数的宏都命名foo并想要调用函数版本,你可以这样做:

(foo)(args)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为类似函数的宏名称后面必须跟一个带括号的参数列表才能进行替换.

这在ISO C99标准的7.1.4/1节中提到:

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

但是,如果您需要这样做,您可能应该在代码中添加注释来解释它,因为它看起来有点奇怪并且不常见.如果可行,从长远来看,重命名函数以避免名称冲突可能更容易维护.