在 C 中使用块结构的宏替换(K&R 问题 4.14)

Macro Substitution using Block Structure in C (K&R Problem 4.14)

当尝试使用块结构作为带有 #define 语句的 "replacement text" 时,例如下面的,

#define swap(t,x,y) { t _z;                     \
_z = x;                                     \
x = y;                                      \
y = _z;                }

然后我尝试将它用于:

printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );

但是我得到以下编译器错误

    414.c:14:21: error: expected expression before ‘{’ token
 #define swap(t,x,y) { t _z;   \
                     ^
414.c:27:41: note: in expansion of macro ‘swap’
   printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );
                                         ^~~~

不允许这样使用块结构吗?如果我想使用宏的局部变量怎么办?

问题提示明确指出要使用块结构,"C Answer Book" 有这段代码作为解决方案。

如果宏展开

printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );

变成

printf( "%.2f %.2f\n", pow(a,b), pow( { int z; z=a; a=b; b=z} ) ) );

{ } 作为表达式无效。 pow 也有两个参数。您可以将其重写为

printf( "%.2f", pow(a,b));
swap(int,a,b);
printf( "%.2f\n", pow(a,b));

问题是你的宏被扩展成这样:

{ int _z;
_z = a;
a = b;
b = _z; }

很快你的电话就变成了:

printf( "%.2f %.2f\n", pow(a,b), pow( { int _z; _z = a; a = b; b = _z; } ) );

由于 pow 需要 2 个参数并且您正在传递一个块,因此无法编译。

Is it not permissible to use block structures like this?

不能作为需要 2 个数字参数(double、int 或其他)的函数的参数。

What if I want to use a variable local to the macro?

你声明局部变量的方式是正确的。