6

我的问题是:如果你有一个宏和一个同名的函数,那么只有宏会被调用,对吗?如果我想调用函数而不是宏怎么办?

4

3 回答 3

14

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

(foo)(args)

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

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

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

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

于 2013-03-27T08:00:43.863 回答
1

重命名两者之一。或者,如果这不可能,请在定义宏并通过该指针调用函数之前创建指向原始函数的函数指针。

于 2013-03-27T08:00:04.037 回答
1

打电话前提供技巧

#ifdef foo
#undef foo
#endif //

因此,在本地调用函数的单个文件中,您将始终具有显式行为

于 2013-03-27T08:12:00.257 回答