C2x:alignas 是关键字而不是宏的理由是什么?

Pav*_*kin 6 c backwards-compatibility language-lawyer

1990 年,PJ Plauger 写道(强调是后加的):

然而,标准 C 为您提供了额外的安全级别。据我所知,这是其他语言标准中没有提供的水平。它承诺,如果您避免使用某些名称集,您将不会遇到冲突。因此,标准 C 使得编写高度可移植的应用程序变得更加容易。

在 C11 中,关键字_Alignas(例如)是alignas<stdalign.h>. 这里我们看到关键字是_Alignas, not alignas(因为在 C11 之前的版本中alignas没有保留)。因此,不会与可能的用户定义发生冲突alignas

然而,在 C2x 中, thealignas是一个关键字并且<stdalign.h>不提供任何内容(并且 C2x 没有提及__alignas_is_defined宏——缺陷?)。这意味着在 C2x 中,任何包含用户定义的 C2x 之前的代码都alignas将导致语义违规,从而破坏向后兼容性。

问题:

  1. 这是否意味着自 C2x 以来,“您将不会遇到碰撞”不再成立?
  2. alignas(例如)成为关键字而不是宏的理由是什么?

Unh*_*eep 5

这些更改的提案(可在https://open-std.org/JTC1/SC22/WG14/www/docs/n2934.pdf获取)认为,有关新关键字的命名策略已经与以前的标准版本不一致:

一些使用非保留名称 ( const, inline) 进行集成,另一些则使用下划线大写形式进行集成。对于其中一些,通过一组库头文件确保使用小写形式。

提案中还提到进一步使用与 C++ 相同的关键字命名(出于兼容性目的),因为一些关键字起源于该语言,后来被添加到 C 中。