C中的预处理宏
宏定义就属于预处理命令的一种。
宏:C 语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。
宏替换:宏替换就是宏定义。在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。
使用宏时要谨慎,尽量以内联函数、枚举和常量代替之。
宏意味着你和编译器看到的代码是不同的, 因此可能导致异常行为, 尤其是当宏存在于全局作用域中。
值得庆幸的是,C++ 中, 宏不像 C 中那么必要。
宏内联效率关键代码 ( performance-criticalcode ) 可以用内联函数替代;
宏存储常量可以 const
变量替代;
宏 “ 缩写 ” 长变量名可以引用替代;
使用宏进行条件编译,这个……,最好不要这么做,会令测试更加痛苦( #define
防止头文件重包含当然是个例外)。
宏可以做一些其他技术无法实现的事情,在一些代码库(尤其是底层库中)可以看到宏的某些特性(如字符串化( stringifying,使用 #
) 、 连接( concatenation,使用 ##
) 等等)。但在使用前,仔细考虑一下能不能不使用宏实现同样效果。
下面给出的用法模式可以避免一些使用宏的问题,供使用宏时参考:
- 不要在 .h 文件中定义宏;
- 使用前正确
#define
,使用后正确#undef
; - 不要只是对已经存在的宏使用
#undef
,选择一个不会冲突的名称; - 不使用会导致不稳定的 C++ 构造 的宏,至少文档说明其行为。