C++学习笔记 28 为什么不用 using namespace std
一、避免自定义变量、方法 与 标准库 同名
1. 3中不同的代码命名风格
- C++标准库:喜欢用 蛇形命名法(snake case:小写单词,中间用下划线链接)
- Pascal、C#:喜欢用 帕斯卡命名法(Pascal Case:单词首字母都大写,无下划线和空格)
- java:喜欢用 驼峰命名法(Camel-Case)
2. 规范混淆带来的问题
- 一般C++标准库习惯于用蛇形命名法:eg:find_if()
- 个人写C++代码一般用 Pascal命名法,eg: FindIf()
- 如果都用同种命名方式,find_if(),则可能产生错乱
using namespace std;
void find_if(int a) {
std::cout << a + 10 << std::endl;
}
int main() {
//如果此处不明确使用std::,则无法分别是想要调用自定义的find_if 还是标准库的find_if
auto it = std::find_if(values.begin(), values.end(), [](int value) {return value > 3; });
}
二、第三方STL库 导致类混淆
都有vector、string 等实现。如果不明确标注:std::vector, 或是 eastl::vector则导致混淆,或方法的错误引用
三、自定义命名空间同方法的混乱
#include<iostream>
#include<string>
namespace apple {
//这个参数这里有一个隐式转换,const char数组隐式转换为string
void print(const std::string& value) {
std::cout << value << std::endl;
}
}
namespace orange {
//无需隐式转换,完全匹配const char*
void print(const char* value) {
std::string temp = value;
std::reverse(temp.begin(), temp.end());
std::cout << temp << std::endl;
}
}
//不同的namespace相同的函数,会调用后引入进来的namespace.
using namespace apple;
using namespace orange;
int main() {
print("Hello");
apple::print("hello");
orange::print("hello");
std::cin.get();
}
四、总结
- 百分百需要避免的:就是在头文件中使用 using namespace,永远不要这样做。谁知道头文件会包括些什么。头文件被引用时,会导致你把这命名空间用在了原本没打算用的地方。
- 我们在某些地方花了几个小时编译调试错误,就是因为某些头文件中使用了using namespace,然后在其他地方被包含。如果你有任何大型项目,追踪起来会非常困难。
- 如果你无法控制自己不使用using namespace,也不要在头文件中使用。我也会用using namespace,但只用来使用自己的库。绝对不会对std使用。也不会对eastl使用,绝不。
- 每一次,我都会使用eastl::vector,我从来都是这么做的,因为我需要清楚的知道我用的是什么,同时我也想避免将来可能出现的错误。
- (不使用using namespace)最大好处就是,看到这些代码,比如std::string,就知道是来自C++标准库,而不是其他库,这非常清晰。
- 如果你确实需要使用using namespace,那就在一个足够小的作用域下使用,如果你只在if语句中使用它,如果你只是在函数中需要它,这是很常见的,那就在函数中使用它。
- 最大的作用域,也就是在一个cpp文件的内部使用。
- 但绝对,绝对,不要在任何头文件中使用它,绝不!

浙公网安备 33010602011771号