在C语言中,调用函数替代宏定义该如何实现?

6

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

3个回答

14

如果你有一个函数和一个宏,它们都被命名为 foo,并且你想调用函数版本,你可以这样做:

(foo)(args)
这是因为函数式宏名称必须后跟括号参数列表才能进行替换。 ISO C99标准第7.1.4 / 1节中提到了这一点:
“头文件中声明的任何函数可以作为在头文件中定义的函数样式宏进行实现,因此,如果在包含其头文件时显式地声明库函数,则可以使用下面所示的技术之一来确保该声明不受此类宏的影响。对于任何函数的宏定义,都可以通过将函数名称括在括号中来本地抑制宏定义,因为名称随后没有遵循指示展开宏函数名称的左括号。出于相同的语法原因,即使将库函数定义为宏,也允许取地址。使用 #undef 来删除任何宏定义还将确保引用实际函数。”
然而,如果您需要这样做,可能应该在代码中添加注释来解释它,因为它看起来有些奇怪,并且不是常见的做法。如果可行,为避免名称冲突而重命名函数可能会更可维护性长远。

旁注,C++的情况完全相同。 - Potatoswatter
是的,原问题的方法让人想起了下游维护的恐怖。但如果他必须这样做,那么这就是方法。 - Randy Howard

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

该宏不会干扰获取函数地址。foo&foo不会导致类似函数的宏调用。但这是对象宏的正确解决方案。 - Potatoswatter

1
提供调用前的技巧
#ifdef foo
#undef foo
#endif //

因此,在调用函数的单个文件中,您始终会有明确的行为。


1
但是没有办法备份和恢复宏,所以在函数调用后就不能再使用它了。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接