C++头文件中写using std::vector是否可行?面试能否使用这类写法?
问题解答
头文件中using声明的合理性
不管是using namespace std还是using std::vector这类单个组件的引入声明,都不建议写在头文件的全局作用域。
头文件会被其他源文件引入,你写在头文件全局的所有using,都会被自动导入到所有引用这个头文件的代码的全局命名空间中,依然存在命名冲突风险:比如你在头文件声明了using std::pair,如果某个引用该头文件的业务代码自己实现了一个名为pair的全局类或者函数,就会直接触发命名冲突,这类问题排查成本很高。
如果想省略std::前缀,可以选择两种合规写法:
- 把你贴的这段
using声明写在*.cpp源文件的开头,作用域只会限制在当前源文件内,不会影响其他代码 - 如果头文件内部高频使用某些标准库组件,可以把这些using声明写在你自定义的命名空间内部,比如你封装的工具代码都放在
namespace mytool里,在这个命名空间内部写using std::vector,影响范围只会局限在你的自定义命名空间内,不会污染全局命名空间。
你贴的这段代码本身没有语法问题,如果是写在.cpp源文件开头可以直接使用,写在头文件全局作用域则不符合工程规范。
面试场景的规范要求
面试场景可以分情况处理:
- 如果是写算法题、功能Demo这类考察逻辑实现的场景,几乎所有面试官都允许直接写
using namespace std,面试核心考察的是你的思路和代码正确性,不会纠结工程规范的细节,写这个还能节省编码时间,完全没问题 - 如果面试题明确考察C++工程规范、头文件设计相关内容,就需要严格按照生产环境的标准回答,明确说明头文件的全局作用域不允许放任何using声明,不管是导入整个命名空间还是单个标准库组件。
内容的提问来源于stack exchange,提问作者Lame Things
相关产品推荐
相关产品推荐

