带有define或inline的C ++宏?

时间:2011-04-12 12:50:38

标签: c++ macros c-preprocessor inline-functions

  

可能重复:
  Inline functions vs Preprocessor macros

在C ++中引入了内联函数来替换C风格的宏(#define macroname ...),仍然,我看到很多C ++代码使用旧的C风格宏而不是内联函数,内联函数不如旧C风格的宏?

3 个答案:

答案 0 :(得分:4)

我会说宏不如内联函数。

内联函数是类型安全的而宏不是。这是他们的最大优势。编译器正在帮助您制作更好的代码。

话虽如此,有些东西可以做宏,功能却无法做到。虽然这些东西并不多......

我相信C程序员已经习惯了宏,只是将他们的习惯继续用于C ++。

答案 1 :(得分:0)

我可以想象的唯一仍然使用宏的方法之一是将 LINE FILE 宏合并到日志记录语句中

例如:

#DEFINE TRACE(S) vGenericLogStatement(__FILE__,__LINE__, s)

其中vGenericLogStatement的定义类似于:

void vGenericLogStatement(char* fileName, int line, char* traceMesg);

它们也是有用的快速和脏字符串连接。

答案 2 :(得分:0)

我不会说他们是劣等的。在C ++中,使用内联函数或模板无法获得相同效果的宏所用的功能并不多。我唯一能想到的是'#'stringize宏运算符,如果Boost有办法做到这一点我也会感到惊讶。

然而,当谈到常数时, 宏可以有一个优点 - 它们通常不会占用任何数据空间,但会直接写入指令流。在具有小内存占用的系统上,这可能是一个主要考虑因素。

相关问题