【问题标题】:Are identifiers starting with an underscore reserved according to the latest C++ standard? [duplicate]是否根据最新的 C++ 标准保留以下划线开头的标识符? [复制]
【发布时间】:2012-10-07 02:47:27
【问题描述】:

可能重复:
What are the rules about using an underscore in a C++ identifier?

我对标准中的相关部分(如果有的话)感兴趣。

【问题讨论】:

  • 为了完整起见,我将在此处链接旧问题stackoverflow.com/questions/228783/… 并提及规则没有改变。
  • 哦,我没看到那个。尽管专门询问 C++11 是相关的,但我不确定现在应该采取什么适当的行动。是否应该关闭这个并编辑另一个的最佳答案?

标签: c++ c++11 standards


【解决方案1】:

是的,当下划线后跟另一个下划线或大写字母时(即用于预处理器#defines 或宏),或者如果标识符位于全局命名空间中(第 17.6.4.3.2 节):

某些名称和函数签名始终保留给实现:

——每个包含双下划线 _ 或以下划线后跟大写字母 (2.12) 的名称都保留给实现以供任何使用。

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

注意,第一点的意思是如果两个下划线出现在标识符中的anywhere,即使在中间或末尾,该名称都是保留的。另外,我想补充一下(§17.6.4.3.5,强调我的):

以下划线开头的

文字后缀标识符保留用于将来的标准化。

【讨论】:

  • 什么是文字后缀标识符?这是否意味着私人会员可以使用_name
  • @fish 该规则与用户定义的文字有关,这意味着foo operator"" _bar(const char*); 可以,但foo operator"" bar(const char*); 是保留的
  • @fish: 说的是user-defined literals.
  • 我发现强调双下划线规则不仅限于开头很重要;双下划线 anywhere 表示保留。
  • @SethCarnegie,好吧,我花了一段时间才意识到foo__bar 已被保留,而不仅仅是__foobar,而且我从很多其他人那里看到了同样的事情。
【解决方案2】:

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

【讨论】:

  • 虽然在您提供的情况下是正确的,但宏忽略范围,因此有一个名为 foo__bar_FooBar 的成员函数仍然可以与它们发生冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2021-11-04
  • 2022-12-14
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多