您好,这是我使用的编译器所需的合法代码:
#use delay(clock=4M)
现在我需要用宏替换括号内的文本clock=4M
。数字4
可以是任何数字,它应该是可修改的。我尝试过以下方法:
#define CLOCK_SPEED(x) clock=xM
但是它没有起作用。
您好,这是我使用的编译器所需的合法代码:
#use delay(clock=4M)
现在我需要用宏替换括号内的文本clock=4M
。数字4
可以是任何数字,它应该是可修改的。我尝试过以下方法:
#define CLOCK_SPEED(x) clock=xM
你需要的是预处理器连接运算符, ##
。
#define CLOCK(x) clock=x##M
void some_function() {
CLOCK(4);
}
结果:
tmp$ cpp -P test.c
void some_function() {
clock=4M;
}
顺便提一下,这样的宏通常是难以发现错误的原因。建议像这样编写它们:
#define CLOCK(x) do { clock=x##M; } while(0)
#define STUFF(x) a=x; b=x
。如果简单地使用它,那么 STUFF(x);
就没问题了。然而,以下情况就更糟糕了:if (x > 3) STUFF(x);
。这个代码可以编译通过,但预处理后变成了 if (x > 3) a=x; b=x
-- 所以 b
将始终被设置!当阅读源代码时,这种问题并不明显,因此追踪此问题可能会很困难。这种问题最有可能发生在将单语句宏更改为多语句宏时。这就是为什么使用 do-while-0 是一个好习惯的原因。 - Snild Dolkow