1. 定义常量:使用 #define 定义常量可以提高代码的可维护性,避免硬编码。
#define PI 3.1415926
这相当于使用 const double PI = 3.1415926;,但 #define 是文本替换,不会创建实际的变量。
2. 定义简单函数:通过宏定义可以创建简单的内联函数,提高执行效率。
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
这里使用了额外的括号来确保表达式的正确性。
3. 单行宏的高级用法:
a) 使用 ## 连接标识符:
#define CONCATENATE(x, y) x##y
例如:int CONCATENATE(var, 1) = 10; // 等同于 int var1 = 10;
b) 使用 # 将参数转换为字符串:
#define STRINGIFY(x) #x
例如:printf("Value of PI is %s", STRINGIFY(3.14)); // 输出 "Value of PI is 3.14"
c) 使用 ## 和 # 结合处理复杂情况:
#define TOKEN_PASTE(x, y) x##y
#define EXPAND_AND_CONCATENATE(x, y) TOKEN_PASTE(x, y)
例如:EXPAND_AND_CONCATENATE(var, __LINE__); // 如果当前行号是 10,则等同于 var10
4. 多行宏的定义:使用反斜杠 \ 来实现多行宏的定义。
#define DECLARE_RTTI(thisClass, superClass)\
virtual const char* GetClassName() const { return #thisClass; }\
static int isTypeOf(const char* type) {\
if (!strcmp(#thisClass, type)) return 1;\
return superClass::isTypeOf(type);\
}\
virtual int isA(const char* type) {\
return thisClass::isTypeOf(type);\
}\
static thisClass* SafeDownCast(DitkObject* o) {\
if (o && o->isA(#thisClass)) return static_cast
return nullptr;\
}
5. 条件编译:使用 #ifdef, #ifndef, #else, #endif 等预处理器指令来实现条件编译。
#ifndef _MY_HEADER_H_
#define _MY_HEADER_H_
// C/C++ 代码
#endif
6. 注意事项:
a) 避免重复定义相同的宏,除非定义完全一致。
b) 可以只定义一个符号而不赋值,例如 #define DEBUG
c) 注意宏定义中的副作用,特别是在使用宏定义函数时,确保所有参数都适当地括起来。