可能重复:
内联函数与预处理器宏
C++ 中引入了内联函数来替换 C 风格的宏(#define 宏名...),但我仍然看到很多 C++ 代码使用旧的 C 风格的宏而不是内联函数,内联函数是否不如旧的 C 风格的宏?
可能重复:
内联函数与预处理器宏
C++ 中引入了内联函数来替换 C 风格的宏(#define 宏名...),但我仍然看到很多 C++ 代码使用旧的 C 风格的宏而不是内联函数,内联函数是否不如旧的 C 风格的宏?
我会说宏不如内联函数。
内联函数是类型安全的,而宏不是。这是他们最大的优势。编译器正在帮助您编写更好的代码。
话虽如此,宏可以做一些函数不能做的事情。不过这样的东西并不多...
我相信 C 程序员已经习惯了宏并且只是将他们的习惯延续到 C++ 中。
我能想象的唯一仍然使用宏的事情之一是将LINE和FILE宏合并到日志语句中
例如:
#DEFINE TRACE(S) vGenericLogStatement(__FILE__,__LINE__, s)
vGenericLogStatement 的定义类似于:
void vGenericLogStatement(char* fileName, int line, char* traceMesg);
它们也是有用的快速和肮脏的字符串连接。
我不会说他们低人一等。在 C++ 中,你可以用宏做的事情并不多,你不能用内联函数或模板获得相同的效果。我唯一能想到的是 '#' stringize 宏操作符,如果 Boost 也有办法做到这一点,我也不会感到惊讶。
然而,当涉及到常量时,宏可以有一个优势——它们通常不会占用任何数据空间,而是直接写入指令流。在内存占用较小的系统上,这可能是一个主要考虑因素。