C++学习笔记 28 为什么不用 using namespace std

一、避免自定义变量、方法 与 标准库 同名

1. 3中不同的代码命名风格

  1. C++标准库:喜欢用 蛇形命名法(snake case:小写单词,中间用下划线链接)
  2. Pascal、C#:喜欢用 帕斯卡命名法(Pascal Case:单词首字母都大写,无下划线和空格)
  3. java:喜欢用 驼峰命名法(Camel-Case)

2. 规范混淆带来的问题

  1. 一般C++标准库习惯于用蛇形命名法:eg:find_if()
  2. 个人写C++代码一般用 Pascal命名法,eg: FindIf()
  3. 如果都用同种命名方式,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库 导致类混淆

EASTL:为游戏和实时系统而生的高性能C++库

都有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();
}

四、总结

  1. 百分百需要避免的:就是在头文件中使用 using namespace,永远不要这样做。谁知道头文件会包括些什么。头文件被引用时,会导致你把这命名空间用在了原本没打算用的地方。
  2. 我们在某些地方花了几个小时编译调试错误,就是因为某些头文件中使用了using namespace,然后在其他地方被包含。如果你有任何大型项目,追踪起来会非常困难。
  3. 如果你无法控制自己不使用using namespace,也不要在头文件中使用。我也会用using namespace,但只用来使用自己的库。绝对不会对std使用。也不会对eastl使用,绝不。
  4. 每一次,我都会使用eastl::vector,我从来都是这么做的,因为我需要清楚的知道我用的是什么,同时我也想避免将来可能出现的错误。
  5. (不使用using namespace)最大好处就是,看到这些代码,比如std::string,就知道是来自C++标准库,而不是其他库,这非常清晰。
  6. 如果你确实需要使用using namespace,那就在一个足够小的作用域下使用,如果你只在if语句中使用它,如果你只是在函数中需要它,这是很常见的,那就在函数中使用它。
  7. 最大的作用域,也就是在一个cpp文件的内部使用。
  8. 但绝对,绝对,不要在任何头文件中使用它,绝不!
posted @ 2025-12-19 16:23  超轶绝尘  阅读(0)  评论(0)    收藏  举报