我想在编译时根据另一个宏的值定义一个宏。但是这段代码没有按预期执行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIXTEEN 16
#define TWO (SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1)
int main();
int main() {
printf("max = %d\n", TWO);
int i;
for (i = 0; i < TWO; i++) {
printf("%d\n", i);
}
return 0;
}
这打印:
max = 2
0
1
2
...
并继续直到终止,此时应该简单地打印:
max = 2
0
1
并退出。
如果我这样做,它会起作用:
#define TWO 2
我认为这是宏定义的问题...但是,如果我对原始的 #define 执行以下操作,它似乎可以工作:
...
int count = TWO;
for (i = 0; i < count; i++) {
...
谁能解释一下这是怎么回事?
问题是令牌TWO
被替换为您定义宏的标记,因此:
i < TWO
变成这样:
i < (SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1)
由于运算符优先级,这被读作:
(i < (SIXTEEN % 8 == 0))
? (SIXTEEN / 8)
: ((SIXTEEN / 8) + 1)
您需要额外的括号,以便当TWO
被替换列表替换,你会得到你想要的结果:
#define TWO ((SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1))
^ ^
使用宏时,最好尽可能使用括号,以确保结果符合您的预期。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)