我的问题是:如果你有一个宏和一个同名的函数,只会调用宏,对吗?如果我想调用函数而不是宏,该怎么办?
答案 0 :(得分:12)
如果你有一个名为foo
的函数和类似函数的宏并想要调用函数版本,你可以这样做:
(foo)(args)
这是有效的,因为类似函数的宏名称后面必须跟一个带括号的参数列表才能进行替换。
ISO C99标准第7.1.4 / 1节中提到了这一点:
标头中声明的任何函数可以另外实现为标头中定义的类函数宏,因此如果在包含标头时显式声明了库函数,则可以使用下面显示的技术之一来确保声明不受这种宏的影响。通过将函数的名称括在括号中,可以在本地抑制函数的任何宏定义,因为该名称后面没有左括号,后面表示宏函数名称的扩展。出于相同的语法原因,即使它也被定义为宏,也允许获取库函数的地址。使用
#undef
删除任何宏定义也将确保引用实际函数。
但是,如果您需要这样做,您可能应该在代码中添加注释来解释它,因为它看起来有点奇怪并且不是常见做法。如果可行,从长远来看,重命名函数以避免名称冲突可能更容易维护。
答案 1 :(得分:1)
重命名其中一个。或者,如果不可能,在定义宏并通过该指针调用函数之前,请创建一个指向原始函数的函数指针。
答案 2 :(得分:1)
在致电前提供技巧
#ifdef foo
#undef foo
#endif //
因此,在调用函数的单个文件中本地,您将始终具有明确的行为