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