C标准库中的符号在C++中是否属于保留标识符?
核心规则依据
相关规定来自C标准「保留标识符」条款(对应C20标准[lex.name]章节):
- 所有来自C标准库的外部链接标识符,均属于全局作用域下的保留标识符。无论是否显式引入对应C标准库头文件,都不允许用户在全局作用域定义同名标识符,否则行为未定义。
- C++标准允许标准库头文件互相引入依赖,复现代码中仅引入了
<iostream>,但主流编译器实现的<iostream>内部会间接引入<time.h>相关内容,因此C标准库的time函数会被注入全局作用域,和自定义的time类产生冲突。
C与C++行为差异的原因
二者的命名空间规则存在本质区别:
- C语言为struct/union/enum的标签提供了独立的命名空间,和普通函数、变量的命名空间互不干扰。C标准库的
time是普通标识符,自定义struct的time标签属于独立命名空间,因此不会冲突。 - C++取消了标签的独立命名空间,类名/结构体名和普通函数、变量属于同一个命名空间,只要重名就会产生冲突,这也是编译器提示必须加
class前缀才能引用自定义类型的原因。
合规规避方案
除换标识符、加class前缀外,更推荐将自定义类型放到自定义命名空间中,可彻底避开全局保留标识符的限制。
内容的提问来源于stack exchange,提问作者Serge Ballesta
相关产品推荐
相关产品推荐

