如果我们看一下GNU的libstdc++实现,我注意到在标准类的实现中,各种类的私有成员函数都以_M_为前缀。例如,std::basic_string<>有一个名为bool _M_is_shared() const;的成员。
我理解为私有成员变量设置某种命名约定的动机。这有助于在视觉上区分类成员和函数局部变量。但我不明白为什么私有成员函数喜欢使用_M_前缀。
如果我看到一些代码调用了(例如:is_shared(); ),实际上只有几个选项:
前两个,都有前缀,所以没有帮助。由于名称空间污染问题,最后一个不会发生在任何正常的实现中。图书馆应该引进的唯一的全球化是标准规定的。所以问题的关键是..。
因为私有成员函数是不可公开访问的。不能以任何方式影响派生类。我不认为名字碰撞真的是个问题.基本上,这些只是一个私有的实现细节。为什么要费心使用(国际海事组织)丑陋的_M_前缀?标准中有什么不允许引入额外的私人成员吗?如果是这样的话,我会觉得很傻,除非我错过了什么。
发布于 2014-03-21 14:50:09
以下划线开头的标识符,然后是大写字母,或以两个下划线开头的标识符,都是“为所有上下文中的实现保留的”。
这意味着它将是非法的,根据标准为某人的程序#define _M_is_shared false和打破库头文件。如果他们使用更多的普通标识符,在其他有效的程序中,这种名称冲突的风险就会更大。
发布于 2014-03-21 14:59:48
标准指定以双下划线开头的名称,或以大写字母后面的下划线开头的名称,保留给内部编译器或库符号。
您指出,这些私有符号是不可访问的,但是不要忘记宏和定义。基本上,这个想法就像“让我们用_M_member代替_M_member”一样简单。
标准的相关部分是17.4.3.1.2全局名称
每个名称都包含一个双下划线
__或以下划线开头,后面跟着大写字母,保留给实现供任何使用。
https://stackoverflow.com/questions/22561847
复制相似问题