可能以下划线开头的变量/成员会困扰编译器吗?


12

从高中开始我就被教导要定义如下变量:

int _a;

要么

int __a;

应该将其视为不良做法,因为这最终会使使用下划线开头的变量来命名临时变量的编译器感到困惑。

据我所知,这就是有些人喜欢在名称末尾移动下划线的原因,例如:

int a_;

但是,我看到很多代码都使用下划线开头的变量。而且该代码在Visual Studio 2010和g ++ 4.x中都可以很好地构建。

所以我想知道:这今天不是问题吗?现代编译器在命名约定方面更聪明吗?


这不是一个真正的答案,但是微软的C ++编译器对此可能特别宽容,因为在私有成员变量之前(至少在C#中)使用下划线是微软的内部风格。我知道g ++的下划线仍然存在问题。
KChaloux

6
您可能会发现此问题的答案很有用。
Blrfl 2013年

1
@KChaloux如果您认为存在20多年的Microsoft C ++编译器团队根据C#团队中某些人的习惯建立了有关可接受的标识符名称的规则,则您不知道Microsoft的工作原理:-)。认真地说,距他们发布第一个C ++编译器已经21年了,这些规则可以追溯到很久以前,甚至可以追溯到原始C编译器代码库中。
凯特·

@Kate我只是指出我知道他们在C#中使用了它。我没有使用Microsoft的C ++编译器,也没有非常了解那里的环境,所以我从对C#的经验推断出他们在C ++中使用了这种命名风格。从来没有任何声称,C#规则首先出现。
KChaloux

Answers:


17

您显然误会了前缀下划线是不良做法的原因。简而言之,这是因为C和C ++标准将这些前缀保留用于实现细节,例如用于标准库实现。(请注意,_和__并非为相同的内容保留,请参见注释)

即使名称在范围内(名称空间,类等),也可能存在一些全局名称,尤其是宏,它们使用这些前缀,并且如果也使用它们,可能会无声地破坏您的代码。

因此,基本上,在大多数情况下,如果不使用这些前缀BUT,则可以安全使用,您可以100%保证命名不会与实现名称冲突。

这就是为什么毫无疑问不使用这些前缀的原因。


3
您的评论适用于两个下划线的前缀,但不适用于单个下划线
Kate Gregory 2013年

1
@KateGregory:保留带下划线的名称,供实现用于全局命名空间中的名称。保留下划线或大写的前导下划线,以供任何使用(实现时可将其用于宏)。因此,在本地范围内,在下划线前加一个小写字母可能没问题,但最好避免使用它,以免跳闸并使用保留名称。
Bart van Ingen Schenau 2013年

4
@KateGregory:作为成员,_limit这不是错误,但是作为全局函数。我认为,有一个简单的策略说“不要无例外地不要使用前划线”,比在某些情况下而不是在其他情况下允许使用下划线更好。但是我们可以同意在这一点上有所不同。需要明确的是,除了开头以外,我在其他地方的下划线都没有问题。
Bart van Ingen Schenau 2013年

2
@BartvanIngenSchenau:仅出于兴趣:像“仅对私人班级成员使用下划线”这样的简单政策不应导致技术问题,您认为这是真的吗?
Doc Brown

1
@KateGregory只是为了澄清,我同意规则比我在回答中所说的更精确;但是这反映了当我尝试记住确切的规则时,我的记忆缺乏精确度。由于我倾向于避免不必了解异常(不是功能),因此我更喜欢易于遵循的通用规则,尤其是对于那些不那么重要的规则。有趣的是,与记住这一点相比,我对移动语义更放心。也许现在我
想起来就

16

使用两个下划线绝对是不好的-保留给特定于编译器的实现细节。这不适用于使用一个下划线。

有些人讨厌下划线。不管你叫什么m_indexhighest_price_a-他们厌恶它。我与25年前的某人一起工作,他告诉我一台特定的IBM打印机(一种非常受欢迎的打印机),通过省略每行的底部像素,该打印机可以在页面上容纳更多行。这对于便笺或大量数字等的输出是很好的,但是对于使下划线的一半不可见的代码有效。(是的,真的!)这一代人通常会产生不合理的下划线仇恨,这可能是由于与该打印机的交互作用,或者是因为与不使用下划线的人打交道。

使用混合大小写(选项我们没有在,说,Fortran)编写一个更可读的方式大多数人认为:mIndexHighestPricea站起来相当不错早前下划线的例子。我给你两个规则:

  • 永远不要用两个下划线启动任何东西(函数,变量,宏,typedef)
  • 选择一个一致的约定(例如,_limit对于函数参数,m_limit对于成员变量,切勿使用下划线,驼峰式大小写,每个词都要大写,匈牙利语,诸如此类)并坚持使用。有时不要以下划线开头,有时结尾,有时不使用下划线以及五种不同的大小写约定。始终如一。

有问题的打印机早已不复存在。如果您想一次使用一个下划线,请随时使用。但请理解,下划线仇恨仍然存在。


“无论您叫m_index还是Supreme_price或_a-他们都讨厌它”并非没有道理!您没有提到标准中有一些规则,这些规则专门与标识符中前导下划线的使用有关。为什么在很容易避免的情况下要求麻烦?stackoverflow.com/a/228797
Max Barraclough

没有提及?再次阅读第一句话。
凯特·格雷戈里

“这不适用于使用一个下划线”不是全部内容,请参阅我的链接,该链接说用双下划线开头绝对是不行,但是“保留在全局名称空间中:标识符以下划线”。为什么玩火?
Max Barraclough

1
好的,您错过了重点。第二段讨论一般而言是反对下划线的人的存在。没有领先的下划线。所有下划线。是的,的确,除了关于两个下划线的规则外,还存在关于以下划线的规则:前导下划线后跟一个大写字母,在全球范围内前导下划线等,但是除此之外,某些人还是讨厌下划线。这些人就是我喜欢称的错误。没有基于标准的理由反对无引号的下划线。但是人们还是这样做。
凯特·格雷戈里

那就是我们不同意的地方。是的,有时以单个下划线开头的标识符合法的。正如我上面所说,为什么要玩火?我从不以下划线开头的标识符;我将其视为一种代码气味(如果可以说是“查看”一种气味:-P)。这样,我永远不会担心规则的细节,这些规则会准确地告诉我何时才是合法的。
Max Barraclough
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.