我不想引发讨论或任何事情;我只是好奇是否有任何具体的原因,为什么在C / C ++库头文件中的名称开头常常发现次要内容。 (例如_x,_y,__ f()等)
答案 0 :(得分:7)
C和C ++都为实现保留了这些名称,以避免与非实现代码冲突。
这保证了在兼容程序中,实现内部符号的“安全”空间不会被冲突的第三方代码破坏。
因此,实现使用它是有意义的。
[C99: 7.1.3]
,[C++11: 17.6.4.3.2/1]
,“What are the rules about using an underscore in a C++ identifier?”
答案 1 :(得分:0)
库实现应该只使用这些保留名称,因此它们不会与用户代码中使用的任何名称冲突。当然,这仅在用户知道规则并且避免自己使用保留名称时才有效。
对于(可能)比您想要的更多信息,请参阅What are the rules about using an underscore in a C++ identifier?。
答案 2 :(得分:0)
来自GNU手册
除了本手册中记录的名称外,还有保留名称 包括所有外部标识符(全局函数和变量) 以下划线('_')和所有标识符开头,不管用途如何 以两个下划线或下划线后跟一个开头 大写字母是保留名称。这是图书馆和 头文件可以为内部定义函数,变量和宏 目的,没有与用户程序中的名称冲突的风险。
ISO 9899:2011也表示:
7.1.3保留标识符
每个标头声明或定义其中列出的所有标识符 相关子条款,并可选择声明或定义标识符 列在其相关的未来图书馆方向子条款和 标识符,总是保留用于任何用途或用作 文件范围标识符。
- 所有以下划线开头的标识符和 大写字母或另一个下划线总是保留给任何人 使用
- 始终保留以下划线开头的所有标识符 用作普通和标记中具有文件范围的标识符 命名空格。
答案 3 :(得分:0)
如果我们查看 Rationale for International Standard—Programming Languages—C,则会在7.1.3
保留标识符中涵盖此主题并说明(强调我的):
同样为实现者保留的是所有外部标识符,以下划线开头,所有其他标识符以下划线开头,后跟大写字母或下划线。 这为写入大量幕后非外部宏以及库正常工作所需的功能提供了名称空间。
这为库实现者提供了一组可以安全使用的名称,而不必担心与使用该实现的代码发生冲突。 C ++ 中也保留了相同的标识符。