我完成这段代码是为了让预处理器在运行时对其进行评估。
#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)
现在,据我所知,这无法编译,因为 if
是 void
类型的语句,这意味着它不会产生值。为了把事情弄清楚,你需要做的就是
#define setPinToPortBit(pin) \
pin < 19 \
? PORTD ## pin \
: pin > 14 \
? PORTB ## (pin-14) \
: PORTC ## (pin - 8)
现在,预处理器会将这一行变成
digitalWrite(15<19 ? PORTD15 : 15>14 ? PORTB1 : PORTC7);
这是正确的 C,如果 PORTD15
、PORTB1
和 PORTC7
是具有相同静态类型的有效常量。
现在,C 编译器将编译它。按照标准,编译器被授权编译这段代码,就好像它是
digitalWrite(PORTD15);
但这不是强制性的:编译器可以根据需要进行选择。
我通常看到的是,如果您启用优化,所有体面的现代编译器都可以并且将会预先评估这些常量条件。如果未启用优化或您在 Debug模式下编译,那么我认为编译器将保持语句原样,而无需预先评估条件。因为您可能想要进入它们并通过调试器更改自然执行,然后您可能希望该代码被编译并可用,即使它通常永远不会被执行。
当然,您可以通过反汇编可执行文件并对其进行分析来获得更准确的信息。
我是一名优秀的程序员,十分优秀!