【发布时间】:2021-01-21 10:19:42
【问题描述】:
我是told 认为#defining 语言关键字是未定义的行为。这与以下事实有何关系:
- 用户可以
#define代码中不是关键字的名称。 - 随着时间的推移,该语言可以获得以前不是关键字的新关键字。
- 如果用户使用的任何构造不再受支持,用户应该能够使用新编译器编译旧代码并获得编译时诊断而不是未定义的行为。
#3 显然是我的假设,但我认为这个假设很重要,因为较新的编译器往往更好,并且“了解现行法律的全部范围”是一个理论上的法律假设,不适用于软件开发人员,我希望(如果编译器假设否则,它可以用它喜欢的任何未定义行为替换代码中的任何编译时错误)。
【问题讨论】:
-
您链接到的问题已被删除,因此无济于事。我们中的许多人看不到它。
-
@anastaciu:不是每个人都有超过 10k 的代表。再说一遍,没有帮助。
-
您链接到的评论并没有比您在问题中所说的更多。只需将其删除。
-
你不需要走到这个 UB 案例中:一个新的、冲突的关键字通常会导致语法错误。这就是为什么 C++ 的新关键字有点牵强(
constexpr、consteval、co_await、总有一天reflexpr...) -
TBH,我想知道为什么 3. 不成立。如果遇到
#define <keyword>,编译器会报告警告应该是一个非常简单的功能。
标签: c++