gpt4 book ai didi

c - 它是否在运行前由预处理器评估?

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:52 24 4
gpt4 key购买 nike

我完成这段代码是为了让预处理器在运行时对其进行评估。

#define setPinToPortBit(pin)\
if (pin < 19) PORTD ## pin;\
else if(pin>14) PORTB ## (pin-14)\
else PORTC ## (pin - 8)

#define STATION1 setPinToPortBit(15)

有什么方法可以知道何时评估此代码示例?

它是否在预处理时进行评估,使得代码 digitalWrite(STATION1, 1)将在编译之前产生 digitalWrite(PORTB1, 1)或者一些扩展的东西,包括 ifs 和 elses,比如 digitalWrite(if(15<19)....

最佳答案

假设你有这条线

digitalWrite(STATION1, 1)

预处理器会将它变成(假设我仍然可以做数学):

digitalWrite(if (15 < 19) PORTD15; else if(15>14) PORTB1 else PORTC7)

现在,据我所知,这无法编译,因为 ifvoid 类型的语句,这意味着它不会产生值。为了把事情弄清楚,你需要做的就是

#define setPinToPortBit(pin) \
pin < 19 \
? PORTD ## pin \
: pin > 14 \
? PORTB ## (pin-14) \
: PORTC ## (pin - 8)

现在,预处理器会将这一行变成

digitalWrite(15<19 ? PORTD15 : 15>14 ? PORTB1 : PORTC7);

这是正确的 C,如果 PORTD15PORTB1PORTC7 是具有相同静态类型的有效常量。

现在,C 编译器将编译它。按照标准,编译器被授权编译这段代码,就好像它是

digitalWrite(PORTD15);

但这不是强制性的:编译器可以根据需要进行选择。

我通常看到的是,如果您启用优化,所有体面的现代编译器都可以并且将会预先评估这些常量条件。如果未启用优化或您在 Debug模式下编译,那么我认为编译器将保持语句原样,而无需预先评估条件。因为您可能想要进入它们并通过调试器更改自然执行,然后您可能希望该代码被编译并可用,即使它通常永远不会被执行。

当然,您可以通过反汇编可执行文件并对其进行分析来获得更准确的信息。

关于c - 它是否在运行前由预处理器评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com