C预处理器中一个表达式的多个结果

C预处理器中一个表达式的多个结果,c,c-preprocessor,avr-gcc,C,C Preprocessor,Avr Gcc,为了解决这个问题,我将代码缩减到最小,以查找错误并检查主文件中定义的表达式F_CPU的结果 #ifndef USART_H_ #define USART_H_ #include <avr/io.h> #define USART_BAUDRATE 4800 #define USART_BSCALE -3 #if USART_BSCALE < 0 #define USART_BSEL ((F_CPU / 1

为了解决这个问题,我将代码缩减到最小,以查找错误并检查主文件中定义的表达式
F_CPU
的结果

#ifndef USART_H_
#define USART_H_

#include <avr/io.h>



#define USART_BAUDRATE          4800
#define USART_BSCALE            -3

#if USART_BSCALE < 0
    #define USART_BSEL          ((F_CPU / 16) * (1<<(-1*USART_BSCALE)) / USART_BAUDRATE - (1<<(-1*USART_BSCALE)))
    #if (USART_BSEL < 0)
        #pragma message "BSEL < 0"
    #elif (USART_BSEL == 0)
        #pragma message "BSEL = 0"
    #elif (USART_BSEL > 0)
        #pragma message "BSEL > 0"
    #endif
#endif

#endif
如何从该代码中获取多条消息?它们又有什么不同呢


输出总是两行,但根据我对
BAUDRATE
F_CPU
(我使用了L、UL和ULL)使用的整数后缀,我会得到不同的pragma消息。为什么预处理器的行为是这样的?

什么是“F#U CPU定义”?它包含了两次吗?为了精确地生成这两条pragma行,它是
#定义F#U CPU 32000000 ul
,当将代码转换为.c并添加F#U CPU定义时,我只得到BSEL>0。Peder:对于每个包含,您得到一个打印输出。一些东西(F#u CPU?)在包含之间发生变化。什么是F#u CPU定义?它包含两次吗?为了精确地生成这两条pragma行,它是
#define F#u CPU 32000000 ul
,当将代码转换为.c并添加F#u CPU define时,我只得到BSEL>0。Peder:对于每个包含,您都得到一个打印输出。在包裹体之间有些东西(F_CPU?)发生了变化。
#pragma message: BSEL > 0
#pragma message: BSEL < 0