如何在C语言中实现宏

5

您好,这是我使用的编译器所需的合法代码:

#use delay(clock=4M)

现在我需要用宏替换括号内的文本clock=4M。数字4可以是任何数字,它应该是可修改的。我尝试过以下方法:

#define CLOCK_SPEED(x)        clock=xM

但是它没有起作用。

1
定义“没有工作”。你期望什么,你得到了什么?话虽如此,您需要在链中添加第二个宏,在扩展“clock=xM”之前扩展“x”。 - John Bode
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、具体问题或错误以及重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建[mcve]。 - too honest for this site
1
我很清楚OP的意图,以及他实际遇到的问题和解决方法。 - Sébastien Dawans
1个回答

13

你需要的是预处理器连接运算符, ##

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

没错,它可以正常工作。只要我被允许,我就会立即点击接受答案。 - Radoslaw Krasimirow
你的建议如何使得更容易发现错误? - Fiddling Bits
1
它并不会消除这些问题,而是减少引入它们的风险。想象一下一个宏定义 #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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接