【问题标题】:Preprocessor commands not working in C language预处理器命令不适用于 C 语言
【发布时间】:2021-12-04 06:56:29
【问题描述】:

在编译这个程序时它给出了错误信息。

错误:标记 ""India"" 在预处理器表达式中无效。

但在 #define COUNTRY "India" 中没有语法错误,当我使用 单引号

时也没有显示此错误消息

它还在 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

【问题讨论】:

  • 那么你的问题是什么? TL;DR 预处理器无法比较字符串。一切正常,您的代码无效,编译器告诉您您的代码无效。
  • 是的,我正在使用预处理器来比较字符串。您能否分享一下声明预处理器无法比较字符串的资源?
  • could you please share the resource 好吧,但是 C 语言标准规定了允许的内容,而不是不允许的内容。所以would be here #if 而constant-expression is defined per here,它只是没有提到字符串比较是允许的常量表达式形式。另请参阅更多用户友好的网站:en.cppreference.com/w/c/language/constant_expression。无论如何,在普通代码中"string" == "string2" 比较的是指针,而不是字符串内容,所以这是行不通的。
  • @KamilCuk,非常感谢!

标签: c c-preprocessor directive preprocessor


【解决方案1】:

[来自评论]能否请您分享声明预处理器无法比较字符串的资源?

#define COUNTRY "India" 不会报告错误,因为预处理器宏可以定义为任何标记——它们不必是数字;它们可以是字符串或运算符,也可以是各种类型的多个标记。

#if COUNTRY == "USA" 报告错误,因为#if 指令需要常量表达式。这在 2018 C 标准的第 6.10 条第 1 段中有所规定。6.10.1 1 进一步规定它应为整数常量表达式(除了它还可能包含 defined <i>identifier</i> 和 defined ( <i>identifier</i> )。

6.6 6 说:

一个整数常量表达式应该是整数类型,并且只能有整数常量、枚举常量、字符常量、sizeof 其结果为整数常量的表达式、_Alignof 表达式和作为强制转换的直接操作数的浮动常量……

字符串文字"India" 和"USA" 不是整数常量、枚举常量、字符常量、sizeof 表达式、_Alignof 表达式或浮动常量。因此,#if COUNTRY == "USA" 违反了 C 标准的约束。

另外,请注意 C 不使用 == 运算符比较字符串。在"India" == "USA" 中,每个字符串文字都将被转换为其第一个元素的地址,然后将这两个地址进行比较。当然,任何两个不同的字符串总是有不同的地址。但是,在"USA" == "USA" 中,C 标准没有指定是否有两个数组都包含“USA”或只有一个数组,因此== 可以评估为真或假。所以不要使用== 来比较字符串。您可以使用strcmp,在&lt;string.h&gt; 标头中声明。 (但它仍然不能在#if 指令中使用。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2011-02-22
    • 2021-12-29
    • 1970-01-01
    • 2013-06-13
    相关资源
    最近更新 更多