Clang标准库变量与函数中_、__前缀的含义解析
Clang 配套 libc++ 标准库中下划线前缀的命名含义
这些前缀不是随意设计的命名风格,是严格遵循C++标准的保留标识符规则制定的,核心作用是彻底隔离标准库内部实现命名与用户代码的自定义命名,从根源上避免命名冲突。两类前缀的具体规则和用途如下:
- 双下划线(
__)开头的标识符
C标准明确规定,所有双下划线开头、或是单下划线后紧跟大写字母的标识符,在任意作用域下都保留给编译器、标准库实现方使用。用户自行编写的代码禁止定义这类标识符,否则触发的所有异常问题都属于未定义行为,标准不做任何兼容性保证。
你贴出的代码里的__throw_out_of_range、__str_find_first_not_of、__msg、__p、__sz、__pos、__n、__npos、_NOEXCEPT都属于这类保留命名,全是libc的内部实现逻辑,不属于对外暴露的标准公开API,库开发者可以随时调整接口定义、修改参数甚至直接删除,不需要考虑对用户代码的兼容。 - 单下划线(
_)开头的标识符
单下划线开头、后续跟小写字母的标识符,仅在全局命名空间作用域下保留给实现方使用。你贴出的代码里的_CharT、_SizeT、_Traits就属于这类命名,是libc++内部使用的模板参数类型名,同样属于不对外公开的实现细节。
注意:不要在业务代码里直接调用任何带这类下划线前缀的标准库内部接口,这类接口没有任何兼容性承诺,哪怕是小版本升级,都可能出现签名修改、实现删除的变动,直接导致代码编译失败或者运行时出现不可预期的问题。
对应的代码片段:
inline void __throw_out_of_range(const char*__msg) { throw out_of_range(__msg); } // __str_find_first_not_of template<class _CharT, class _SizeT, class _Traits, _SizeT __npos> inline _SizeT __str_find_first_not_of(const _CharT *__p, _SizeT __sz, const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
内容的提问来源于stack exchange,提问作者gahhu
相关产品推荐
相关产品推荐

