C++禁止用户使用以下划线开头加字母或双下划线命名的标识符,因其为编译器和标准库保留,违者导致未定义行为;应采用snake_case或camelCase命名,避免\_开头、双下划线及下划线加大写字母组合。
C++ 里没有这种语法,所有下划线开头的标识符(尤其是双下划线或以下划线加大写字母开头)都是保留给编译器和标准库的,你自己定义或调用时用它,属于未定义行为——轻则编译警告,重则运行时崩溃或优化出错。
为什么不能写
或
这是 C++ 标准硬性规定:
开头 + 大写字母(如
)、或连续两个下划线(如
)的名称,任何作用域下都禁止用户使用。标准库头文件(比如
)大量依赖这类命名做内部实现,你一撞上,就可能:
链接时报
或符号冲突
开启
后函数被莫名内联/优化掉
在不同平台(Linux/macOS/MSVC)表现不一致,本地能跑,CI 上挂
记住:不是“不推荐”,是“不准用”。
怎么安全地命名和调用自定义函数
直接用小写字母+下划线(
)或驼峰(
),避开所有以
开头的组合:
✅ 推荐:
、
、
❌ 绝对避免:
、
、
、
(后者是宏,但你自己别模仿)
⚠️ 特别注意:类成员变量也别用
,虽然有些项目这么用,但和标准库头里的
类似,容易在模板实例化时引发 ODR 违规
调用时就是普通函数调用,没特殊语法:
遇到
怎么快速定位
这个错误八成不是链接问题,而是你误用了保留名,导致声明和定义实际没对上:
检查头文件里是否写了
,而实现文件里写了
(漏了下划线)
用
看符号是否存在;如果输出为空,说明编译器根本没把它当你的函数处理
在 GCC/Clang 下加
(Clang 默认开,GCC 需显式加),能提前报出这类命名警告
别急着改链接脚本或加
,先搜代码里所有
开头的函数名。
真正麻烦的不是语法会不会,是这些名字看起来“好像能用”,等项目大了、跨平台了、开了 LTO,才突然崩——那时再查,得翻好几层模板展开和预处理结果。
C知道
CSDN推出的一款AI技术问答工具
下载
函数_函数__myfunc__Func__funcmultiple definition-O2snake_casecamelCase_calculate_totalloadConfigis_valid_input_init__parse_MyClass__LINE___member_M_implint result = calculate_total(data);undefined reference to `_foo'extern "C" void _process();void process() { ... }nm -C your_object.o | grep _process-Wreserved-identifier-lxxx_