首页 > 解决方案 > 在 C 中使用块结构进行宏替换(K&R 问题 4.14)

问题描述

当尝试将块结构用作带有#define 语句的“替换文本”时,例如下面,

#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”中有这段确切的代码作为解决方案。

标签: cmacroscurly-braces

解决方案


如果宏被展开

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));

推荐阅读