【发布时间】: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