NOTE: This is a question, though I added in case some C++ expert can provide a rationale or historical reason why C++ is using a different wording than C.


在C标准库规范中,我们有以下规范性文本,C17 7.1.3保留标识符(emphasis mine):

  • 以下划线和大写字母或另一个下划线are always reserved for any use开头的所有标识符.
  • 所有以下划线开头的标识符在普通和标记名空间中始终保留为文件范围的标识符.

现在我一直在阅读各种尊敬的C专家的答案,他们声称编译器或标准库可以使用带下划线+大写或双下划线的标识符.

"保留任何用途"不是意味着保留anyone个,除了C语言本身的future 扩展吗?这意味着允许实现使用它们.

而上面的第二个短语,关于单个前导下划线,似乎是针对实现的?

一般来说,C标准的编写方式要求编译器供应商/库实现者是典型的读者,而不是应用程序程序员.

值得注意的是,C++有一个非常不同的措辞:

  • 每个名称都包含一个双下划线(__)或以下划线开头,后跟一个大写字母(2.11)is reserved to the implementation for any use.

(见What are the rules about using an underscore in a C++ identifier?)

这可能是C和C++的混淆,这里的语言不同吗?

推荐答案

在C标准中,术语"保留"的含义由7.1.3p2定义,紧接在您引用的项目符号列表下面:

不保留任何其他标识符.如果the program在保留的上下文中声明或定义标识符(7.1.4允许的情况除外),或将保留的标识符定义为宏名称,则行为未定义.

Emphasis mine: reserved identifiers place a restriction on the program, not the implementation. Thus, the common interpretation – reserved identifiers may be used by the implementation to any purpose – is correct for C.

我没有跟上C++标准,不再觉得有资格解释它.

C++相关问答推荐

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

为什么静态说明符为内联函数生成外部定义?

有效地计算由一组点构成的等边三角形和等腰三角形的数量

在C中使用动态内存分配找到最小的负数

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

在列表中插入Int指针(C)

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

进程在写入管道时挂起

GDB输出ARM助记符

&;(str[i])和(&;str)[i]有什么区别?

如何在C中使数组变量的值为常量?

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

GetText不适用于包含国际字符的帐户名称

用C++初始化局部数组变量

未为同一文件中的函数执行DirectFunctionCall

SSE 向量与 Epsilon 的比较

C11 嵌套泛型

段错误try 访问静态字符串,但仅有时取决于构建环境