预编译 不能用枚举
今天被枚举给坑了一下,枚举不能用于预编译中间,不能就肯定不是想要的逻辑。 例如 enum{Name_0, Name_1, Name_2};
define NAME Name_2
int main(void) {
if (NAME == Name_1)
printf("111\n");
else
printf("222\n");
endif
} 结果输出的肯定是 111
找到的解释如下
The `#if' command in its simplest form consists of
if expression controlled text #endif / expression /
The comment following the #endif' is not required, but it is a good practice because it helps people match the
#endif' to the corresponding #if'. Such comments should always be used, except in short conditionals that are not nested. In fact, you can put anything at all after the
#endif' and it will be ignored by the GNU C preprocessor, but only comments are acceptable in ANSI Standard C.
expression is a C expression of integer type, subject to stringent restrictions. It may contain
Integer constants, which are all regarded as long or unsigned long.
Character constants, which are interpreted according to the character set and conventions of the machine and operating system on which the preprocessor is running. The GNU C preprocessor uses the C data type `char' for these character constants; therefore, whether some character codes are negative is determined by the C compiler used to compile the preprocessor. If it treats `char' as signed, then character codes large enough to set the sign bit will be considered negative; otherwise, no character code is considered negative.
Arithmetic operators for addition, subtraction, multiplication, division, bitwise operations, shifts, comparisons, and `&&' and `||'.
Identifiers that are not macros, which are all treated as zero(!).
Macro calls. All macro calls in the expression are expanded before actual computation of the expression's value begins.
Note that `sizeof' operators and enum-type values are not allowed. enum-type values, like all other identifiers that are not taken as macro calls and expanded, are treated as zero.
The controlled text inside of a conditional can include preprocessor commands. Then the commands inside the conditional are obeyed only if that branch of the conditional succeeds. The text can also contain other conditional groups. However, the #if' and
#endif' commands must balance.
From: