Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么人们在C+中使用如此多的双下划线+; 我通过一些开源C++代码查看了一下,我注意到代码中使用了很多双下划线,主要是在变量名的开始。 return __CYGWIN__;_C++_Syntax - Fatal编程技术网

为什么人们在C+中使用如此多的双下划线+; 我通过一些开源C++代码查看了一下,我注意到代码中使用了很多双下划线,主要是在变量名的开始。 return __CYGWIN__;

为什么人们在C+中使用如此多的双下划线+; 我通过一些开源C++代码查看了一下,我注意到代码中使用了很多双下划线,主要是在变量名的开始。 return __CYGWIN__;,c++,syntax,C++,Syntax,只是想知道:这是有原因的,还是只是一些人的代码风格?我认为这会使阅读变得困难。这是在“正常”代码中不应该做的事情。这确保编译器和系统库可以定义与你的符号不冲突的符号。 < P>根据C++标准,从一个下划线开始的标识符被保留到库中。以两个下划线开头的标识符保留给编译器供应商。来源: 根据ANSI-C标准,在标识符中使用两个下划线(`_')是为编译器内部使用而保留的 下划线(`uu')通常用于库函数的名称中(例如“\u main”和“\u exit”)。为了避免冲突,标识符的开头不要以下划线开头 上

只是想知道:这是有原因的,还是只是一些人的代码风格?我认为这会使阅读变得困难。

这是在“正常”代码中不应该做的事情。这确保编译器和系统库可以定义与你的符号不冲突的符号。

< P>根据C++标准,从一个下划线开始的标识符被保留到库中。以两个下划线开头的标识符保留给编译器供应商。

来源:

根据ANSI-C标准,在标识符中使用两个下划线(`_')是为编译器内部使用而保留的

下划线(`uu')通常用于库函数的名称中(例如“\u main”和“\u exit”)。为了避免冲突,标识符的开头不要以下划线开头


上述评论是正确的
\uuuu Symbol\uuuu
通常是有用的编译器(或预处理器)供应商提供的魔术标记。其中使用最广泛的可能是
\uuuu FILE\uuuu
\uuuu LINE\uuuuu
,它们由C预处理器展开以指示当前文件名和行号。当您想要记录某种程序断言失败时,这很方便,包括错误的文本位置。

除了许多其他人响应的库之外,有些人还命名宏或定义用于预处理器的值。这将使它更容易使用,并且可能允许解决旧编译器中的bug


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

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

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

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

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

<>这就是为什么微软使用函数名的方法,它们的核心下划线和小写的情况下,它们的核心运行库函数中的许多都不是C++标准的一部分。这些函数名保证与标准C++函数或用户代码函数不冲突。 得票最多的答案是:

“根据ANSI-C标准,在标识符中使用两个下划线(`_')是为编译器内部使用而保留的。”

然而,在阅读了一些C++和C标准之后,我无法发现任何下划线被限制为编译器内部使用。这些标准更加通用,为实现保留了双下划线

C++ (当前工作草案,于2019年5月26日查阅)在
lex.name
中说明:

  • 每个包含双下划线或以下划线开头,后跟大写字母的标识符都保留给实现以供任何使用
  • 每个以下划线开头的标识符都保留给实现,以用作全局命名空间中的名称
C 虽然这个问题是针对C++的,但我引用了C 99和17标准的相关章节:

第7.1.3节

  • 所有以下划线和大写字母或其他下划线开头的标识符始终保留供任何使用
  • 所有以下划线开头的标识符始终保留用作普通名称和标记名称中具有文件范围的标识符 空间
和C99说的一样

什么是实施
? 对于C/C++,松散地表示从用户源文件生成可执行文件所需的资源集。这包括:

  • 预处理器
  • 编译程序
  • 链接器
  • 标准库
示例实现 <>有很多不同的C++实现。(无锚定链接,ctrl+f“执行”)


为什么很难阅读?它的设计主要是作为一个delimeter,就像引用。我记得,它主要用于内置常量。不,它不是分隔符。下划线用于区分为实现保留的名称和用户源代码可以使用的名称。用户可以做
#define FOO 1
,但他们不能做
#define(定义)FOO(定义)1
,因此实现可以自由地为自己的宏、变量、函数等使用名称
(定义)。我认为Matthew的意思是它在风格上/视觉上是一个delimeter,而不是功能上。这是一个有趣的假设,但鉴于我之前阅读的内容和Jonathan的回答,这是不正确的。更重要的是:在任何地方包含双下划线的标识符都是保留的。在C++中,我只看到[LeX.Name ]和全局名称[Global .Name ]。你能给我推荐信吗?感谢C++,我只看到[LeX.Name ]和全局名称[全局名称]。你能给我推荐信吗?《指南》看起来像是在命名空间< /C> >之前编写的,它也来自帝国理工学院,而不是C++标准;这可能是一个很好的建议。@cz名称空间是不相关的。系统标头可以定义以下划线开头的宏名称,例如
\u main
。标识符以下划线开头