假设我们已经定义了宏交换:
#define SWAP(a,b) {\
int tmp = a; \
a = b; \
b = tmp;}\使用SWAP,我们需要对3个数字进行排序(只需编写另一个使用名为SWAP的宏的宏):
#define SORT(a,b,c) \
(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c)))我是这样写的,但我的代码只显示了一些错误:
#include <stdio.h>
#define SWAP(a,b) {\
int tmp = a; \
a = b; \
b = tmp;}\
#define SORT(a,b,c) \
(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c)))
int main()
{
int a = 1024, b = 7, c = 11;
printf("a = %d b = %d\n", a, b);
SWAP(a,b)
printf("a = %d b = %d\n", a, b);
printf("a = %d b = %d c = %d\n", a, b);
SORT(a,b,c)
printf("a = %d b = %d c = %d\n", a, b);
return 0;
}我得到的错误:
error: expected expression before ‘{’ token|发布于 2014-01-23 00:18:00
让我们展开排序(a,b,c)宏:
(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c)))展开每个交换(a,b):
(a > b) ? {
int tmp = a;
a = b;
b = tmp;
} : ((a > c) ? {
int tmp = a;
a = c;
c = tmp;
} : ((b>c) : {
int tmp = b;
b = c;
c = tmp;
}))这不是有效的C代码。这就是它无法编译的原因。
它的定义如下:
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }顺便说一句,使用虚拟的do-while循环(参见:C multi-line macro: do/while(0) vs scope block )定义多行宏是一种很好的做法:
#define SWAP(a,b) do {\
int tmp = a; \
a = b; \
b = tmp;} while(0)\这样,您就可以像编写常规函数调用一样编写它:
SWAP(a,b);发布于 2014-01-23 00:18:04
在用gcc -E编译时,SORT宏是这样展开的
(a > b) ? {int tmp = a; a = b; b = tmp;} : ((a > c) ? {int tmp = a; a = c; c = tmp;} : ((b>c) : {int tmp = b; b = c; c = tmp;}))这里的问题是交换函数中的大括号和分号。
发布于 2014-01-23 22:19:45
@Tamas Zahola您需要修改
#define SORT(a,b,c) \
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) }在整个程序中,如果b的值大于c,这将不起作用。
https://stackoverflow.com/questions/21288146
复制相似问题