libstdc++中内部函数前缀_M的含义是什么
libstdc++ 中
_M 前缀的含义 这是GNU实现的C标准库(libstdc)内部统一遵循的命名约定,核心设计目的是规避符号冲突、标识内部实现细节,具体说明如下:
- 符合C标准的保留标识符规则
C标准明确规定:所有包含双下划线,或者单下划线后紧跟大写字母的标识符,都属于编译器、标准库实现方的保留标识符,禁止用户代码自定义这类名称,否则会触发未定义行为。libstdc++使用_M开头的命名,就是严格遵循该规则,确保内部实现的符号完全不会和用户自己定义的类、函数、变量名产生冲突。 _M是Member(成员)的缩写
所有带_M前缀的符号,都是类的非公开(私有/保护)成员,可能是成员函数,也可能是成员变量,属于完全不对外暴露的实现细节。你给出的示例就是典型场景:
void _M_add_ref_copy() { __gnu_cxx::__atomic_add_dispatch(&_M_use_count, 1); }
这里的_M_add_ref_copy是引用计数相关类的内部成员方法,_M_use_count是存储引用计数的内部成员变量,二者都不会出现在标准库的公开API中,普通用户正常使用标准库完全不需要感知这类符号的存在。
- 配套的其他内部命名惯例
libstdc++中还有几类常见的保留命名前缀,都遵循同样的设计逻辑:- 双下划线
__开头的符号,一般是全局作用域、命名空间作用域下的内部实现函数/变量 - 单下划线加大写开头的
_Tp、_Args等,一般是模板参数的命名
- 双下划线
小提示:日常开发中不要自定义任何双下划线开头、或者单下划线加大写字母开头的标识符,避免和编译器、标准库的保留符号产生冲突。
内容的提问来源于stack exchange,提问作者mzhan017
相关产品推荐
相关产品推荐

