_NAME、__NAME、_NAME_、__NAME__ 等符号的含义
Posted
技术标签:
【中文标题】_NAME、__NAME、_NAME_、__NAME__ 等符号的含义【英文标题】:Meaning of notations like _NAME, __NAME, _NAME_, __NAME__ 【发布时间】:2010-11-24 18:39:22 【问题描述】:我已经在无数的 C/C++ 头文件和源文件中看到了这一点。 除了个人喜好之外,这些不同符号的含义是什么?
_NAME
__NAME
_NAME_
__NAME__
NAME_t
老实说,我理解的唯一一个是_NAME
,它是一个类的私有成员(至少在 C# 中是这样)。
有人能解释一下它们之间的区别吗? 如果有任何其他值得注意的符号,请提及它们(即使是其他类似的语言)。
谢谢!
【问题讨论】:
【参考方案1】:以_
或__
开头的名称通常用于保留标识符,您不应定义/创建以该约定开头的标识符。 (_ 后面跟大写)
来自 C99 标准,7.1.3 -“保留标识符”
——所有以下划线和大写字母或其他字母开头的标识符 下划线始终保留用于任何用途。
- 所有以下划线开头的标识符始终保留用作标识符 在普通名称空间和标记名称空间中都有文件范围。
来自 C++03 标准(对 C++98 的修订),第 17.4.3.1.2 节 - “全局名称”
- 每个名称都包含双下划线 (_ _) 或以下划线开头,后跟一个大写- 大小写字母 (2.11) 保留给实现以供任何使用。
- 每个以下划线开头的名称都保留给实现,用作 全局命名空间
【讨论】:
【参考方案2】:除了NAME_t
,所有这些名称都是为“实现”保留的,即标准C++库代码。 禁止在自己的代码中使用此类名称。
第 17.6.3.3.2 节“全局名称”§1 规定:
某些名称和函数签名始终保留给实现:
每个包含双下划线或以下划线后跟大写字母的名称都保留给实现以供任何使用。
每个以下划线开头的名称都保留给实现,用作全局命名空间中的名称。
(请注意,这些规则禁止像 __MY_FILE_H
这样我经常看到的标题保护。)
【讨论】:
只是为了更清楚一点:在类级别名称以下划线开头是允许的(因为它们不在全局命名空间中),并且通常用于私有字段. @Matteo:只要第二个字符不是大写字母,这是正确的。但_[A-Z_]+
完全保留。
@R.:是的,你是对的,另一个答案在这方面更完整。【参考方案3】:
以_t
结尾的类型在POSIX 中是reserved。
【讨论】:
以上是关于_NAME、__NAME、_NAME_、__NAME__ 等符号的含义的主要内容,如果未能解决你的问题,请参考以下文章