预处理器命令不适用于 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 指令中使用。)