在 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?
你声明局部变量的方式是正确的。
当尝试使用块结构作为带有 #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?
你声明局部变量的方式是正确的。