首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU _M_前缀背后的心态

GNU _M_前缀背后的心态
EN

Stack Overflow用户
提问于 2014-03-21 14:42:00
回答 2查看 416关注 0票数 6

如果我们看一下GNU的libstdc++实现,我注意到在标准类的实现中,各种类的私有成员函数都以_M_为前缀。例如,std::basic_string<>有一个名为bool _M_is_shared() const;的成员。

我理解为私有成员变量设置某种命名约定的动机。这有助于在视觉上区分类成员和函数局部变量。但我不明白为什么私有成员函数喜欢使用_M_前缀。

如果我看到一些代码调用了(例如:is_shared(); ),实际上只有几个选项:

  1. 它是这个类的成员函数
  2. 它是父类的成员函数
  3. 这是一个全局函数。

前两个,都有前缀,所以没有帮助。由于名称空间污染问题,最后一个不会发生在任何正常的实现中。图书馆应该引进的唯一的全球化是标准规定的。所以问题的关键是..。

因为私有成员函数是不可公开访问的。不能以任何方式影响派生类。我不认为名字碰撞真的是个问题.基本上,这些只是一个私有的实现细节。为什么要费心使用(国际海事组织)丑陋的_M_前缀?标准中有什么不允许引入额外的私人成员吗?如果是这样的话,我会觉得很傻,除非我错过了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-21 14:50:09

以下划线开头的标识符,然后是大写字母,或以两个下划线开头的标识符,都是“为所有上下文中的实现保留的”。

这意味着它将是非法的,根据标准为某人的程序#define _M_is_shared false和打破库头文件。如果他们使用更多的普通标识符,在其他有效的程序中,这种名称冲突的风险就会更大。

票数 5
EN

Stack Overflow用户

发布于 2014-03-21 14:59:48

标准指定以双下划线开头的名称,或以大写字母后面的下划线开头的名称,保留给内部编译器或库符号。

您指出,这些私有符号是不可访问的,但是不要忘记宏和定义。基本上,这个想法就像“让我们用_M_member代替_M_member”一样简单。

标准的相关部分是17.4.3.1.2全局名称

每个名称都包含一个双下划线__或以下划线开头,后面跟着大写字母,保留给实现供任何使用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22561847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档