注意:这是一个c问题,但我添加了c ++,以防一些C++专家可以提供C++使用与C不同的措辞的基本原理或历史原因.
在C标准库规范中,我们有这个规范性文本,C17 7.1.3保留标识符(强调我的):
- 所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途.
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符.
现在我继续阅读各种受尊敬的C专家的答案,他们声称编译器或标准库可以使用下划线+大写或双下划线的标识符.
是否"保留用于任何用途"是指保留给除C语言本身的未来扩展之外的任何人?这意味着实现不容许使用它们.
虽然上面的第二个短语,关于单个前导下划线似乎是针对实现?
通常,C标准的编写方式要求编译器供应商/库实现者是典型的读者 - 而不是应用程序员.
值得注意的是,C++的措辞非常不同:
- 每个包含双下划线(
__)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何使用.
(请参阅在C++标识符中使用下划线有哪些规则?)
这可能是C和C++之间的混淆,语言在这里有所不同吗?
考虑 Aykhan Hagverdili 提供的以下示例:
#include <string>
using std::operator""s;
#define s foobar
auto s = "hello world"s;
Run Code Online (Sandbox Code Playgroud)
有些编译器会替换s并导致编译失败。有些编译器不会替代s.
请参阅此处的结果: https: //godbolt.org/z/jx4nhYczd gcc 失败,clang 编译
哪个是对的?