我正在浏览一些开源的C ++代码,并注意到代码中使用的分数很多,主要是在变量名称的开头。
return __CYGWIN__;
只是想知道这是有原因的,还是仅仅是某些人的代码风格?我认为我很难阅读。
答案 0 :(得分:119)
来自Programming in C++, Rules and Recommendations:
在标识符中使用两个下划线(`__')保留用于编译器根据ANSI-C标准的内部使用。
下划线(`_')通常用于库函数的名称(例如“_main”和“_exit”)。为了避免冲突,请不要使用下划线开始标识符。
答案 1 :(得分:48)
除非他们认为自己是“实施的一部分”,即标准库,否则他们不应该这样做。
规则相当具体,比其他人建议的要详细一些。
所有包含双下划线或以下划线后跟大写字母开头的标识符都保留用于所有范围的实现,即它们可能用于宏。
此外,所有其他以下划线开头的标识符(即没有后跟另一个下划线或大写字母)都保留给全局范围内的实现。这意味着您可以在自己的命名空间或类定义中使用这些标识符。
这就是Microsoft为许多核心运行时库函数使用带有前导下划线和全部小写的函数名称的原因,这些函数不属于C ++标准。保证这些函数名不会与标准C ++函数或用户代码函数冲突。
答案 2 :(得分:34)
根据C ++标准,以一个下划线开头的标识符保留给库。以两个下划线开头的标识符保留给编译器供应商。
答案 3 :(得分:10)
上述评论是正确的。 __Symbol__
通常是由您的有用编译器(或预处理器)供应商提供的魔术令牌。也许最广泛使用的是__FILE__
和__LINE__
,它们由C预处理器扩展以指示当前文件名和行号。当你想记录某种程序断言失败时,这很方便,包括错误的文本位置。
答案 4 :(得分:8)
这是“普通”代码中你不应该做的事情。这可确保编译器和系统库可以定义不会与您的符号冲突的符号。
答案 5 :(得分:1)
除了许多其他人回复的库之外,有些人还将宏命名或#define值命名为与预处理器一起使用。这样可以更容易使用,并且可能允许解决旧编译器中的错误。
与其他提到的一样,它有助于防止名称冲突,并有助于在库变量和您自己的变量之间进行描述。
答案 6 :(得分:0)
投票最多的答案引用了Programming in C++: Rules and Recommendations:
“在标识符中使用两个下划线('__')保留给编译器根据ANSI-C标准在内部使用。”
我搜索了一些C ++和C标准,但没有发现下划线仅限于编译器内部使用。
C++(当前工作草案,于2019-5-26访问)在lex.name
中的状态:
- 每个包含双下划线__或以下划线后跟大写字母开头的标识符都保留给实现用于任何用途。
- 每个以下划线开头的标识符都保留给实现,以用作全局命名空间中的名称。
尽管这个问题是C ++特有的,但我引用了C标准99和17的相关章节:
C99第7.1.3节
- 所有以下划线开头,大写字母或另一个下划线开头的标识符始终保留用于任何用途。
- 所有以下划线开头的标识符始终被保留,以用作普通名和标记名中文件范围的标识符 空格。
C17说的与C99相同。