2012-10-16 36 views
1

可能重复:
What are the rules about using an underscore in a C++ identifier?根据最新的C++标准,标识是否以下划线开头?

我从标准感兴趣的相关章节(如果有的话)。

+4

为了完整起见,我将链接这里的老问题http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier并提及规则没有改变。 –

+0

哦,我没有看到那一个。尽管专门询问C++ 11是相关的,但我不确定现在适合采取什么行动。是否应该关闭这一个,并编辑另一个的最高级答案? –

回答

7

是的,当下划线后跟另一个下划线或大写字母(即,用于预处理的#define或宏),或者如果该标识符是在全局命名空间(§17.6.4.3.2):

名称和功能特征的一组特定总是保留给实现:

- 包含一个双下划线_或下划线跟着是一个大写字母开头的每个名称(2.12)是保留对任何实施使用。

- 以下划线开头的每个名称都保留给实现以用作全局名称空间中的名称。

注意,第一点意味着,如果两个下划线在标识符出现的任何地方,即使在中间或结束时,将名被保留。另外,我想补充(§17.6.4.3.5,重点煤矿):

文字后缀标识开始用下划线被保留给未来的标准化。

+0

什么是文字后缀标识符?这是否意味着可以使用'_name'作为私人成员? –

+0

@fish该规则适用于用户定义的文字,这意味着'foo运算符'“_bar(const char *);'是好的,但'foo运算符”“bar(const char *);'是保留的 –

+0

@fish:它是在谈论[用户定义的文字]。(http://en.wikipedia.org/wiki/C%2B%2B11#User-defined_literals) –

0

他们不喜欢保留,但for你不应该使用它们,因为编译器开发人员可以使用它们来命名自己的功能,所以它可能与你的函数冲突。所以如果你使用my_class::_function那么应该没有错误,但是编写一个像void _function()这样的全局函数可能会产生一个带有一个编译器的重复项!

+0

虽然,在你提供的情况下,宏忽略范围,所以有一个名为'foo__bar'或'_FooBar'的成员函数仍然可以与这些函数相冲突。 – chris

相关问题