3 回答
TA贡献1805条经验 获得超10个赞
宏功能:
宏已预处理
无类型检查
代码长度增加
使用宏可能会导致副作用
执行速度更快
在将编译宏名称替换为宏值之前
在小代码多次出现的地方很有用
宏也没有检查编译错误
功能特点:
功能已编译
类型检查已完成
代码长度保持不变
无副作用
执行速度较慢
在函数调用期间,发生控制转移
在大型代码多次出现的地方很有用
功能检查编译错误
TA贡献1809条经验 获得超8个赞
副作用很大。这是一个典型的情况:
#define min(a, b) (a < b ? a : b)
min(x++, y)
扩展到:
(x++ < y ? x++ : y)
x在同一条语句中增加两次。(以及未定义的行为)
编写多行宏也很麻烦:
#define foo(a,b,c) \
a += 10; \
b += 10; \
c += 10;
他们要求\在每行的末尾。
宏不能“返回”任何东西,除非您将其设为单个表达式:
int foo(int *a, int *b){
side_effect0();
side_effect1();
return a[0] + b[0];
}
除非您使用GCC的expression语句,否则无法在宏中执行此操作。(编辑:虽然您可以使用逗号运算符...但是忽略了它...但是它可能仍然不太可读。)
操作顺序:(由@ouah提供)
#define min(a,b) (a < b ? a : b)
min(x & 0xFF, 42)
扩展到:
(x & 0xFF < 42 ? x & 0xFF : 42)
但&优先级低于<。因此0xFF < 42首先被评估。
- 3 回答
- 0 关注
- 491 浏览
添加回答
举报