根据此问题,首先对预处理程序进行评估,然后对枚举进行处理。我检查了这是真的!
我有一个枚举 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。
预处理程序从中进行简单的文本替换(*)
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代码也不在乎。