【问题标题】:C library identifiers and reserved rulesC 库标识符和保留规则
【发布时间】:2014-12-01 16:09:02
【问题描述】:

在 C11 标准的 7.1.3 中列出了一些关于哪些是保留标识符的规则。

最后说:

没有保留其他标识符。如果程序声明或定义了一个 标识符在保留它的上下文中(除了允许 由 7.1.4),或将保留标识符定义为宏名称, 行为未定义。

但是,如果我尝试使用 GCC 来打破其中一个规则,例如我写了 int __A; 之类的东西,编译器什么也不会告诉我。现在也许我不太了解,但是这些规则中的哪一个定义了您可以有未定义行为的事实?

【问题讨论】:

  • @Deduplicator,我的问题不是什么是 UB,而是如果所有规则都可以生成 UB!
  • @xdevel2000,不是全部,只是那些这么说的。这个是这么说的。标准应该定义语言的每个部分(从标准的角度声明一些 UB 是好的:它明确地将特定情况定义为 UB)。正如我所看到的,UB 的要点是它清楚地定义了编译器在哪些情况下可以做“任意事情”:如果在特定行为上,标准中没有这样的声明,则该行为至少应该是可扣除的。
  • @Jubatian:不,该标准仅在某些情况下明确调用 UB。在它没有定义任何东西的地方,它是由遗漏定义的。
  • @Deduplicator:好吧,出于好奇,从未尝试深入 C 编译器来体验这一点:您能否指出其中一两个特别有趣/关键的遗漏?我把这些解释得有点像“嘿,你,编译器!在这里你可以做任何你想做的事,但在其他任何地方都不能乱搞!”。

标签: c


【解决方案1】:

未定义行为的一个可能结果是您没有收到警告、没有错误,并且一切正常。

另一个结果是您通过点发布升级您的编译器并且之前工作的代码开始中断。

【讨论】:

  • 是的,我知道;但也许我的问题不清楚。我想知道 UB 是否仅在我,即重新定义已经声明到库头文件中的标识符,或者如果我写了一个像 __a 这样的标识符,但没有在任何头文件中声明。我希望这更清楚。谢谢。
  • 在任何一种情况下都是未定义的行为。话虽如此,如果不使用标识符,我无法想象编译器会在该代码上出错。
【解决方案2】:

编译器可能会警告您未定义的行为,但并非必须如此。在许多情况下,它没有。对于 GCC,您至少应该使用 -Wall -Wextra 选项,但在这种情况下它不会有帮助。

诸如夹板、PC-Lint、QA-C 等静态分析工具会给您更多关于未定义行为的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多