2008-10-22 178 views
78

我正在浏览一些开源的C++代码,并注意到在代码中使用得分的情况下,主要是在变量名称的开头。为什么人们在C++中如此使用__(双下划线)

return __CYGWIN__; 

只是想知道是有原因,还是只是一些人的代码样式?我会认为我很难阅读。

+1

为何难读?它的设计主要是作为一个分隔符,就像引号一样。我记得,它主要用于内建常量。 – 2008-10-22 03:40:20

回答

107

Programming in C++, Rules and Recommendations

在标识符中使用两个下划线的(`__')根据ANSI-C标准保留用于编译器的内部使用。

下划线(`_')中的库函数的名称(如 “_main” 和 “_exit”)经常被使用。为避免冲突,请勿使用下划线开始标识符。

+0

该指南看起来像是在`namespace`引入之前编写的。 – 2017-05-28 18:47:47

8

这是你不想在'普通'代码中做的事情。这确保了编译器和系统库可以定义不会与你碰撞的符号。

32

根据C++标准,以一个下划线开头的标识符为库保留。以两个下划线开头的标识符保留给编译器供应商。

+14

不仅如此:保留了其中包含双下划线的标识符*。 17.4.3.1.2 – 2008-10-22 11:24:24

+0

在C++中,我只看到[lex.name]和全局名称[global.names]。你能提供参考吗?谢谢 – 2014-01-11 02:18:08

9

上述意见是正确的。 __Symbol__通常是您的有用编译器(或预处理器)供应商提供的神奇令牌。也许这些中使用最广泛的是__FILE____LINE__,它们被C预处理器扩展为指示当前文件名和行号。当你想记录某种程序断言失败时,这很方便,包括错误的文本位置。

1

除了许多其他的人回答一下,有些人还打着宏或者将#define值与预处理使用库。这样可以更容易处理,并且可能允许旧版编译器中的错误得到解决。

和其他人一样,它有助于防止名称冲突,并有助于在库变量和自己的变量之间进行划分。

46

除非他们认为他们是“实施的一部分”,即标准库,否则他们不应该这样做。

这些规则相当具体,比其他人建议的要细一些。

包含一个双下划线或以下划线后跟一个大写字母开头的所有标识符保留在所有范围内使用的实施,即它们可以用于宏。

此外,这以下划线开头所有其它标识符(即,不是后跟另一个下划线或一个大写字母)被保留用于在全球范围内的实施。这意味着您可以在您自己的名称空间或类定义中使用这些标识符。

这就是为什么微软使用功能名称与前导下划线和所有小写的许多他们的核心运行时库函数,它们不是C++标准的一部分。这些函数名称保证不会与标准C++函数或用户代码函数冲突。

相关问题