C2x:为什么 alignas 要成为关键字而不是宏的原因是什么?

5
在1990年,P.J. Plauger写道(强调添加):
标准C为您提供了另一层安全性。在我所知道的其他语言标准中,它是唯一提供此层级别的语言。它承诺如果您避免使用某些名称,则不会出现冲突。因此,标准C使编写高度可移植的应用程序变得更加容易。
在C11中引入了关键字`_Alignas`(例如),并伴随着在``中定义的宏`alignas`。在这里,我们看到关键字是`_Alignas`,而不是`alignas`(因为在C11之前,`alignas`未保留)。因此,与可能的用户定义的“alignas”没有冲突。
然而,在C2x中,alignas是一个关键字,并且stdalign.h不提供任何内容(而且C2x对__alignas_is_defined宏没有任何说明——缺陷?)。这意味着在C2x中,任何包含用户定义的alignas的先前C2x代码都将导致语义违规,因此破坏向后兼容性。
问题:
1.这是否意味着自C2x以来,“您将不再遇到冲突”不再适用?
2.alignas(例如)成为关键字而不是宏的基本原理是什么?

3
该提案(https://open-std.org/JTC1/SC22/WG14/www/docs/n2934.pdf)认为,这种方法在一般情况下并不一致。例如:`restrict`在C99中作为小写关键字添加。 - UnholySheep
3
同样地,booltruefalse在C23中也将成为关键字。我认为与C++的兼容性比与旧的垃圾代码的向后兼容性更有说服力。 - Lundin
@UnholySheep所提及的提案也强调与C++的兼容性。我认为这个提案很好地回答了问题。 - nielsen
1
@chux-ReinstateMonica 回复:"现在":确实。已修正。 - pmor
@UnholySheep,你能发表一个答案吗? - pmor
1个回答

4

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

有些是使用非保留名称(constinline)集成的,而其他一些则是使用下划线大写形式集成的。对于其中一些关键字,通过一组库头文件确保了使用小写形式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接