海绵宝宝撒
副作用很大。这是一个典型的情况:#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首先被评估。