C 是否在运行前由预处理器进行评估?

C 是否在运行前由预处理器进行评估?,c,c-preprocessor,C,C Preprocessor,我编写这段代码是为了让预处理器在运行前对其进行评估 #define setPinToPortBit(pin)\ if (pin < 19) PORTD ## pin;\ else if(pin>14) PORTB ## (pin-14)\ else PORTC ## (pin - 8) #define STATION1 setPinToPortBit(15) #定义setPinToPortBit(pin)\ if(pin14)端口B###(pin-

我编写这段代码是为了让预处理器在运行前对其进行评估

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

#define STATION1 setPinToPortBit(15)
#定义setPinToPortBit(pin)\
if(pin<19)端口d##pin\
如果(pin>14)端口B###(pin-14)\
else端口C###(引脚8)
#定义STATION1 setPinToPortBit(15)
有没有办法知道这个代码样本什么时候会被评估


是否在预处理时评估代码
digitalWrite(STATION1,1)
将在编译前产生
digitalWrite(PORTB1,1)
或一些扩展的东西,包括ifs和else,如
digitalWrite(if)(15),这取决于您所说的评估

定义由预处理器通过代码展开(换句话说,复制粘贴)

常量和常量表达式的计算将在编译时完成。 if子句、if变为if(true)或if(false)将在编译时进行计算,编译器可能会决定删除无法访问的代码


如果希望预处理器对If子句进行求值,则存在#If、#elif或#else。

假设您拥有该行

digitalWrite(STATION1, 1)
预处理器将把它转换为(假设我仍然可以做数学):

现在,预处理器将把该行转换为

digitalWrite(15<19 ? PORTD15 : 15>14 ? PORTB1 : PORTC7);
但这不是强制性的:编译器可以根据它想要的任何东西进行选择

我通常看到的是,如果启用优化,所有优秀的现代编译器都可以并且将预先评估这些恒定条件。 如果未启用优化,或者您正在调试模式下编译,那么我认为编译器将保持语句的原样,而不预先评估条件。因为您可能希望逐步执行这些条件,并通过调试器更改自然执行,然后您可能希望编译该代码并使其可用,即使不会呃通常会被执行


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

在正确运行编译器之前,宏由预处理器展开

代码的扩展版本如下所示:

digitalWrite( if (15 < 19) PORTD15; else if(15>14) PORTB (15-14) else PORTC (15 - 8), 1)
示例:

  #ifdef DEBUG
    /* Your debugging statements here */
  #endif

#if((NUM%2)==0)
      printf("\nNumber is Even");
#else
      printf("\nNumber is Odd");
#endif

如果您询问预处理器是否会进行变量检查,然后为您应用正确的定义,答案是。顺序是,在编译器接受作业之前,预处理器指令将被预处理器计算并替换,因此预处理器不知道正常变量为,无法为您进行检查


不过,预处理器要做的是找到指令的使用位置,并用代码片段替换它。

将在运行时计算
if
语句。预处理器只是一个文本替换引擎。它不会在编译时运行代码。@MichaelWalz可能吧。还有常量表达式计算well@PeterM是的,但这与宏无关。在编译器运行之前,宏都已完全展开。编译器的输入不应包含预处理器指令,或“错误:#C程序中的杂散”@GiulioFranco在最佳情况下(PORTD、PORTC和PORTD为常量)宏(如示例中所用)展开为具有“固定”的表达式值。我们不知道的是编译器是否足够聪明来优化这个表达式。你能举个例子吗?有可能实现我用预处理器#if语句编写的代码行而不是编译if?如何实现?谢谢你提供的大量信息。有可能实现我用预处理编写的代码行吗ssor#if语句而不是普通的if?如何?@CPJ这是不可能的。它的方式很好。#if用于条件编译,而不是用于不断传播。Grazie mille per tutti questi informazioni。
digitalWrite(PORTD15);
digitalWrite( if (15 < 19) PORTD15; else if(15>14) PORTB (15-14) else PORTC (15 - 8), 1)
#ifdef - If this macro is defined
#ifndef - If this macro is not defined
#if - Test if a compile time condition is true
#else - The alternative for #if
#elif - #else an #if in one statement
#endif - End preprocessor conditional
  #ifdef DEBUG
    /* Your debugging statements here */
  #endif

#if((NUM%2)==0)
      printf("\nNumber is Even");
#else
      printf("\nNumber is Odd");
#endif