如果Enums是编译时间,那么#define with Enums是如何工作的?

Swa*_*and 0 c enums

根据此问题,首先对预处理程序进行评估,然后对枚举进行处理。我检查了这是真的!

我有一个枚举 eTypes

typedef enum
{
   eTYPE_1 = 0u,
   eTYPE_2,
   eTYPE_3,
   eTYPE_MAX
} eTypes;
Run Code Online (Sandbox Code Playgroud)

然后我定义一个尺寸为

#define MAX_ARRAY_SIZE (2 * eTYPE_MAX)

并声明为 U8 TestArray[MAX_ARRAY_SIZE]

根据链接的问题,在处理时MAX_ARRAY_SIZE,编译器不知道eTypes。然后如何TestArray获得正确的大小。我看到了6个字节的TestArray。

Bod*_*odo 6

预处理程序从中进行简单的文本替换(*)

U8 TestArray[MAX_ARRAY_SIZE]
Run Code Online (Sandbox Code Playgroud)

U8 TestArray[(2 * eTYPE_MAX)]
Run Code Online (Sandbox Code Playgroud)

然后由编译器处理。编译器将2 * eTYPE_MAX在编译时计算常数值,结果为2 * 3 = 6

(*)更正确地说,预处理器和编译器对源代码的处理要复杂一些。预处理器处理令牌,而不是输入文本的随机部分。参见例如/sf/answers/3672807351/

与该问题有关的要点是,预处理器并不关心eTYPE_MAX替换文本中的enum值是否是一个值,即使替换完全是有效的C代码也不在乎。