我浏览了一些开源C ++代码,发现在代码中使用了很多双下划线,主要是在变量名的开头。
return __CYGWIN__;
只是想知道这是有原因的,还是仅仅是某些人编写了代码样式?我认为我很难阅读。
#define FOO 1
,但他们不能这样做#define __FOO__ 1
,因此实现可以自由使用的名称__FOO__
为自己的宏,变量,函数等
我浏览了一些开源C ++代码,发现在代码中使用了很多双下划线,主要是在变量名的开头。
return __CYGWIN__;
只是想知道这是有原因的,还是仅仅是某些人编写了代码样式?我认为我很难阅读。
#define FOO 1
,但他们不能这样做#define __FOO__ 1
,因此实现可以自由使用的名称__FOO__
为自己的宏,变量,函数等
Answers:
来自C ++编程,规则和建议:
根据ANSI-C标准,标识符中使用两个下划线(__)保留给编译器内部使用。
下划线(_)通常用于库函数的名称(例如“ _main”和“ _exit”)。为了避免冲突,请勿以下划线开头标识符。
namespace
介绍之前编写的。
_main
。
除非他们认为它们是“实现的一部分”,即标准库,否则它们就不应该。
这些规则是相当具体的,并且比其他一些建议更详细。
所有包含双下划线或下划线后跟大写字母的标识符都保留给所有范围的实现使用,即它们可能用于宏。
另外,所有其他以下划线开头的标识符(即,后跟另一个下划线或大写字母的标识符)都保留给全局范围内的实现。这意味着您可以在自己的名称空间或类定义中使用这些标识符。
这就是为什么Microsoft在大多数C ++标准不包含的核心运行库函数中使用带下划线的函数名,并用小写字母表示。这些函数名称保证不会与标准C ++函数或用户代码函数冲突。
根据C ++标准,以一个下划线开头的标识符保留给库。以两个下划线开头的标识符保留给编译器供应商。
投票最多的答案引用了C ++编程:规则和建议:
“在标识符中使用两个下划线('__')保留给编译器根据ANSI-C标准在内部使用。”
然而,阅读一些C ++和C标准后,我无法找到下划线的任何提及被局限于只是编译器的内部使用。这些标准较为笼统,为实现保留了双下划线。
C ++(当前的工作草案,于2019-5-26访问)指出lex.name
:
- 包含双下划线__或下划线后跟大写字母的每个标识符都保留给实现用于任何用途。
- 每个以下划线开头的标识符都保留给实现,以用作全局名称空间中的名称。
尽管此问题特定于C ++,但我引用了C标准99和17的相关章节:
C99第7.1.3节
- 所有以下划线,大写字母或另一个下划线开头的标识符始终保留供任何使用。
- 在普通和标记名称空间中,所有以下划线开头的标识符始终保留为文件范围的标识符。
C17表示与C99相同的内容。
对于C / C ++,该实现宽松地指代从用户源文件生成可执行文件所需的设置资源。这包括:
Wikipedia上提到了许多不同的C ++实现。(无锚链接,按ctrl + f“实现”)