技巧一:可变参数宏
#include <stdio.h>
#define LOG(...) printf(__VA_ARGS__)
int main() {
LOG("This is a log message: %d\n", 10);
return 0;
}
- 副作用:可变参数宏可能会降低代码的可读性,特别是在宏调用嵌套或者参数较多的情况下。而且宏在预处理阶段展开,不进行类型检查,可能导致运行时错误。例如,如果传递给
LOG
的参数类型与 printf
格式字符串不匹配,编译器不会报错,但运行时可能出现错误。
技巧二:宏连接
#include <stdio.h>
#define CONCAT(a, b) a##b
int main() {
int value12 = 100;
int result = CONCAT(value, 12);
printf("result: %d\n", result);
return 0;
}
- 副作用:宏连接可能会导致命名冲突。比如在不同的代码模块中,如果都使用了类似的宏连接逻辑,可能会意外地连接出相同的标识符,导致编译错误或者运行时的未定义行为。另外,宏连接使得代码阅读起来更加困难,因为连接后的标识符与原始宏参数关系不直观。