GNU _M_前缀背后的心态

Eva*_*ran 4 c++ gnu naming-conventions libstdc++

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

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

如果我看到一些代码调用的例子:is_shared();基本上只有几个选项:

  1. 它是这个类的成员函数
  2. 它是父类的成员函数
  3. 这是一个全球性的功能.

前两个,都有前缀,所以没有帮助.由于命名空间污染问题,最后一个不会发生在任何理智的实现中.图书馆应该引入的唯一全局变量是标准规定的全局变量.所以这就是问题的症结所在......

由于私人成员职能不公开.无法以任何方式影响派生类.我不认为名称冲突在这里真的是一个问题......基本上这些只不过是一个私有的实现细节.为什么要担心(IMO)丑陋的_M_前缀?标准中有什么东西不允许引入额外的私人成员吗?如果是这样,除非有我遗漏的东西,否则会让我感到愚蠢.

asc*_*ler 5

标识符以下划线开头,然后是大写字母,或以两个下划线开头,"保留用于在所有上下文中实现".

这意味着根据某人的程序标准来#define _M_is_shared false破坏库头文件是违法的.如果他们使用更多普通标识符,则在其他有效程序中发生此类名称冲突的风险会更大.

  • @MadScienceDreams:17.6.4.3/2:"如果一个程序在保留它的上下文中声明或定义一个名称,除了本条款明确允许的,它的行为是未定义的." 是的,你可以这样做,但标准规定这样做与解除引用`nullptr`一样糟糕,任何出错的都是程序的错,而不是实现的错误. (2认同)