【问题标题】:fatal error C1017: invalid integer constant expression when using "#if (false)"致命错误 C1017:使用“#if (false)”时的整数常量表达式无效
【发布时间】:2014-11-16 16:23:21
【问题描述】:

以下代码在 Linux 下运行,但 MSVS 出错

#if (false)
....
#endif

错误是:致命错误C1017:无效的整数常量表达式

我在 Microsoft 的网站上找到了这份报告: http://msdn.microsoft.com/en-us/library/h5sh3k99.aspx

虽然那里描述的信息与我的情况相比略有不同,因为我没有使用“#define”

所以我的问题是:

  1. 有什么方法可以让它在不更改代码的情况下为 MSVC 工作?
  2. 如果必须更新代码,这种情况的最佳解决方案是什么?

【问题讨论】:

  • “因为我没有使用“#define””——你包含的任何标题怎么样?如果您不包含任何标题,它是否会以同样的方式失败?
  • 预处理器对false 或其他关键字一无所知——这些是用于编译器的。预处理器只知道宏名称和文字。让它#if 0
  • @IgorTandetnik 这对于 C 是正确的,但对于 C++ 是不正确的(这个问题是关于)。
  • @hvd Igor 的评论不是关于 C 中的真实情况,而不是 C++ 中的真实情况。它是关于第 4 阶段的真实情况,而不是第 4 阶段的不真实情况。false 是 C++ 中的关键字,但不是在第 4 阶段,引用标准,“所有标识符要么是宏名称,要么不是宏名称 - - 根本没有关键字、枚举常量等”。
  • @HWalters 这是一个注释。规范性文本明确提出了两个例外:“由于宏扩展和defined一元运算符的所有替换都已执行,所有剩余的标识符和关键字,除了truefalse,替换为pp号0,然后将每个预处理令牌转换为一个令牌。”然后将 pp-token 转换为令牌,就像它在 #if 表达式之外发生的那样。

标签: c++ visual-studio-2010 macros boolean


【解决方案1】:

看起来您的 MS 编译器版本不支持将 false 作为内置常量。这并不奇怪,因为微软在支持 C 和 C++ 标准方面的记录参差不齐。

在不更改代码的情况下使其工作的一种方法是将命令行参数传递给编译器以将 false 定义为 0 并将 true 定义为 1:

-Dfalse=0 -Dtrue=1

【讨论】:

  • 只有在 MS 不支持 #if 表达式中的 false 时才会失败,并且具有特殊的 C++ 规则,其中 false 在 @ 中保持原样987654325@ 表达式。在 C 中,false 不是关键字,#if (false) 只是桃色:false0 替换。 (同样适用于 #if (true)#if (aowehfbwa),就此而言。)因此我对这个问题的评论:我比你更相信 MS 没有把 that 搞砸。 :)
  • 测试表明,即使我还有一点点信心,也是完全不值得的。你的答案是正确的。不过,我担心您对falsetrue 的定义可能会弄乱重载解决方案。在#if 指令之外将它们保留为bool 类型的常量的替代方法会更好,但我不确定如何。
  • @hvd 这不是 UB 吗(正如我的回答中所解释的那样?
  • @Columbo 假设包含标准库头文件,那么是的,该行为不是由标准定义的。但是nottruefalse 定义为宏也没有被标准定义:标准没有描述程序在不符合标准的实现上的行为。这是一个选择较小的邪恶的问题。
  • 我会将其更改为 -Dfalse=(!1)-Dtrue=(!0) 以支持 typeid 和重载解析。此外,现代 Visual C++ 的/一些系统头文件会检查是否定义了关键字。这需要被禁用。
【解决方案2】:

有什么方法可以让它在不更改代码的情况下为 MSVC 工作?

不是真的。标准禁止为false 定义宏,这是有充分理由的,[macro.names]/2:

翻译单元不得以词汇方式命名#define#undef 与关键字、表 3 中列出的标识符或 attribute-tokens 在 7.6 中描述。

而且我没有看到任何其他方式。

如果必须更新代码,这种情况的最佳解决方案是什么? 案例?

0 替换false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-03
    • 2017-05-16
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多