预处理器命令不适用于 C 语言
Preprocessor commands not working in C language
编译此程序时出现错误消息。
错误:标记“India”在预处理器表达式中无效。
但是 #define COUNTRY "India" 中没有语法错误,而且当我使用 单引号 [=33= 时也没有显示此错误消息]
并且它还在 last printf(); 中显示一条错误消息和多个警告。
警告:字符常量对其类型而言太长
错误:字符串常量前需要声明说明符或“...”
最后三个 printf() 和最后两个预处理器命令也完全变灰。
#define COUNTRY "India"
#if COUNTRY == "USA"
printf("US Dollars");
#elif COUNTRY == "Bangladesh"
printf("Bangladeshi Rupees");
#elif COUNTRY == "Nepal"
printf("Nepali Rupees");
#else
printf("Indian Rupees");
#endif
[From a comment] could you please share the resource where it's stated that preprocessor can't compare strings?
#define COUNTRY "India"
没有错误报告,因为预处理器宏可以定义为任何标记——它们不必是数字;它们可以是字符串或运算符或各种类型的多个标记。
报告 #if COUNTRY == "USA"
错误,因为 #if
指令需要 constant-expression。这在 2018 C 标准的第 6.10 节第 1 段中指定。6.10.1 1 进一步指定它应为整数常量表达式(除了它还可能包含 defined <i>identifier</i>
和 已定义 ( <i> 标识符 </i> )
.
6.6 6 说:
An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof
expressions whose results are integer constants, _Alignof
expressions, and floating constants that are the immediate operands of casts…
字符串文字"India"
和"USA"
不是整型常量、枚举常量、字符常量、sizeof
表达式、_Alignof
表达式或浮点常量。因此,#if COUNTRY == "USA"
违反了C标准的约束。
此外,请注意 C 不会将字符串与 ==
运算符进行比较。在 "India" == "USA"
中,每个字符串文字将被转换为其第一个元素的地址,然后比较这两个地址。当然,任何两个不同的字符串总会有不同的地址。但是,在 "USA" == "USA"
中,C 标准没有指定是两个数组都包含“USA”还是只有一个数组,因此 ==
可以计算为 true 或 false。所以不要使用 ==
来比较字符串。你可以使用strcmp
,声明在<string.h>
header。 (但它仍然不能在 #if
指令中使用。)
编译此程序时出现错误消息。
错误:标记“India”在预处理器表达式中无效。
但是 #define COUNTRY "India" 中没有语法错误,而且当我使用 单引号 [=33= 时也没有显示此错误消息]
并且它还在 last printf(); 中显示一条错误消息和多个警告。
警告:字符常量对其类型而言太长
错误:字符串常量前需要声明说明符或“...”
最后三个 printf() 和最后两个预处理器命令也完全变灰。
#define COUNTRY "India"
#if COUNTRY == "USA"
printf("US Dollars");
#elif COUNTRY == "Bangladesh"
printf("Bangladeshi Rupees");
#elif COUNTRY == "Nepal"
printf("Nepali Rupees");
#else
printf("Indian Rupees");
#endif
[From a comment] could you please share the resource where it's stated that preprocessor can't compare strings?
#define COUNTRY "India"
没有错误报告,因为预处理器宏可以定义为任何标记——它们不必是数字;它们可以是字符串或运算符或各种类型的多个标记。
报告 #if COUNTRY == "USA"
错误,因为 #if
指令需要 constant-expression。这在 2018 C 标准的第 6.10 节第 1 段中指定。6.10.1 1 进一步指定它应为整数常量表达式(除了它还可能包含 defined <i>identifier</i>
和 已定义 ( <i> 标识符 </i> )
.
6.6 6 说:
An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants,
sizeof
expressions whose results are integer constants,_Alignof
expressions, and floating constants that are the immediate operands of casts…
字符串文字"India"
和"USA"
不是整型常量、枚举常量、字符常量、sizeof
表达式、_Alignof
表达式或浮点常量。因此,#if COUNTRY == "USA"
违反了C标准的约束。
此外,请注意 C 不会将字符串与 ==
运算符进行比较。在 "India" == "USA"
中,每个字符串文字将被转换为其第一个元素的地址,然后比较这两个地址。当然,任何两个不同的字符串总会有不同的地址。但是,在 "USA" == "USA"
中,C 标准没有指定是两个数组都包含“USA”还是只有一个数组,因此 ==
可以计算为 true 或 false。所以不要使用 ==
来比较字符串。你可以使用strcmp
,声明在<string.h>
header。 (但它仍然不能在 #if
指令中使用。)