C / C ++中的函数调用宏

use*_*398 5 c c++

如果foo()在varius平台上以不同的方式调用了函数,那么使用宏是否是错误的做法?

例如:

#ifdef WIN32
#define ffoo(a) foo(0)
#else
#define ffoo(a) foo(a)
#endif
Run Code Online (Sandbox Code Playgroud)

Den*_*rim 1

是的。宏不知道它们所处的范围或上下文,它们在实际编译短语之前运行并替换它的出现。

假设您想ffoo在其他地方使用名称,也许作为类的方法名称,甚至是另一个函数:

int MyClass::ffoo(int y) {}
Run Code Online (Sandbox Code Playgroud)

这会意外地导致编译错误,因为ffoo(...)会扩展为函数调用,错误的标记出现在错误的位置。

一个非常常见且令人讨厌的例子是一个名为minmax定义的宏,一旦您尝试使用 C++std::numeric_limits<T>::max()函数,您就会发现糟糕的设计。

更好的选择是内联函数,因为它们尊重语言语义,毕竟它们是函数。

#ifdef WIN32
inline int ffoo(int a) { return foo(0); }
#else
inline int ffoo(int a) { return foo(a); }
#endif
Run Code Online (Sandbox Code Playgroud)

如果您处于不支持关键字的 C89 环境中,inline您也许可以使用static,考虑到此调用的大小,它不会造成伤害。