什么';“的意思是什么;留作任何用途;? 注意:这是一个问题,尽管我补充说,一些C++专家可以提供一个理论或历史原因,为什么C++使用的词与C.不同。

什么';“的意思是什么;留作任何用途;? 注意:这是一个问题,尽管我补充说,一些C++专家可以提供一个理论或历史原因,为什么C++使用的词与C.不同。,c,c++,language-lawyer,c-standard-library,C,C++,Language Lawyer,C Standard Library,在C标准库规范中,我们有以下规范性文本,C17 7.1.3保留标识符(重点): 所有以下划线和大写字母或另一个下划线开头的标识符总是保留供任何使用 所有以下划线开头的标识符始终保留为在普通和标记名称空间中用作具有文件范围的标识符 现在我一直在阅读各种尊敬的C专家的答案,他们声称编译器或标准库可以使用带下划线+大写或双下划线的标识符 “保留给任何人使用”难道不意味着除了C语言本身的未来扩展之外,任何人都可以保留吗?这意味着不允许实现使用它们 而上面的第二个短语,关于单个前导下划线,似乎是针对实

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

  • 所有以下划线和大写字母或另一个下划线开头的标识符总是保留供任何使用
  • 所有以下划线开头的标识符始终保留为在普通和标记名称空间中用作具有文件范围的标识符
现在我一直在阅读各种尊敬的C专家的答案,他们声称编译器或标准库可以使用带下划线+大写或双下划线的标识符

“保留给任何人使用”难道不意味着除了C语言本身的未来扩展之外,任何人都可以保留吗?这意味着不允许实现使用它们

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

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

<> P,特别是C++有一个非常不同的措辞:

  • 包含双下划线(
    \uuu
    )或以下划线开头,后跟大写字母(2.11)的每个名称都保留给实现以供任何使用
(见附件)


这是C和C++之间的混淆,语言不同吗?

< P>在C标准中,“保留”一词的含义是由7.1.3p2定义的,紧接在你引用的弹头列表下面:

没有保留其他标识符。如果程序在保留标识符的上下文中声明或定义标识符(7.1.4允许的除外),或将保留标识符定义为宏名称,则该行为未定义

重点:保留标识符对程序而不是实现施加限制。因此,通用解释——保留标识符可由实现用于任何目的——对C是正确的


< >我没有跟上C++标准,也没有资格解释它。

< P>虽然标准主要是用来指导实现者的,但它是作为程序的形成和效果的描述来写的。这是因为符合标准的编译器的基本定义是对任何符合标准的程序执行正确的操作:

严格一致的程序应仅使用语言和库的这些特性 本国际标准中规定的……符合 托管实施应接受任何严格符合要求的程序

单独阅读,这对编译器的扩展有很大的限制。例如,仅基于该子句,编译器不应该定义任何自己的保留字。毕竟,特定编译器可能想要保留的任何给定单词都可能出现在严格一致的程序中,迫使编译器手动执行

然而,标准仍在继续:

一致性实施可具有扩展(包括附加 库函数),前提是它们不会改变任何严格符合 节目

这是关键。编译器扩展需要以这样一种方式编写,即它们影响非一致性程序(那些包含未定义行为的程序,或者根本不应该编译的程序),从而允许它们编译并执行有趣的额外操作

因此,当语言实际上不需要这些标识符做任何事情时,定义“保留标识符”的目的是通过为实现提供一些使程序不符合要求的东西,给它们一些额外的回旋空间。编译器之所以能够识别,比如说,
\uuuuudeclspec
作为声明的一部分,是因为将
\uuuuuudeclspec
放入声明是非法的,因此编译器可以做任何它想做的事情

因此,“保留供任何使用”的重要性在于,编译器有权将此类标识符视为具有其所关心的任何含义,这一点毋庸置疑。未来的兼容性是一个相对遥远的问题

<> P> C++标准以类似的方式工作,虽然对游戏有点明确:

一致性实现可能具有扩展(包括附加的库函数),前提是它们具有扩展 不改变任何格式良好的程序的行为。需要实现来诊断以下程序: 根据本国际标准,使用格式不正确的扩展但是,在这样做之后, 他们可以编译和执行这些程序。


我怀疑措辞上的差别是C++标准,只是对扩展意味着如何工作更清楚。然而,C标准中的任何内容都不能阻止实现做同样的事情。(我们基本上忽略了每次使用C++代码时,编译器警告你的要求。)

< P>关于C和C++中的措辞差异,我将自己的小研究发布在这里作为参考:

  • 早期版本有以下内容:

    …仅由库函数使用的名称以下划线开头,因此它们不太可能与用户程序中的名称冲突

  • K&R第二版增加了附录B,其中介绍了标准库,我们可以在其中阅读

    以下划线开头的外部标识符保留供库使用,所有标识符都是这样 以下划线和大写字母或其他下划线开头的其他标识符

  • 早期ANSI C dr
    #ifdef __ACME_COMPILER
    #define near __near
    #else
    #define near
    #endif
    
    int near foo;