使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀
using std namespace, why (or why not) should I prefix std::?
我是 using namespace std;
那么,编码这个有什么问题呢?
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
据我所知,我应该每次互换放置"using 命名空间"或前缀 std::,但不能同时放置两者。混合两者有什么缺点?
另外,如何替换上面的代码?这是可以接受的吗?
cin.ignore(numeric_limits<streamsize>::max(), 'n');
我
using namespace std;
这通常是一个坏主意,除非它在狭窄的范围内使污染远离程序的其余部分。
那么,编码这个有什么问题呢?
没什么;它只是比它需要的更冗长。该名称既可用作任何范围内的限定std::cin
,也可用作using
转储名称的任何范围内的非限定cin
。但我建议不要将标准库的内容转储到任何其他范围内,以避免库名称与我想使用的名称冲突的危险。
混合两者有什么缺点?
您既有命名空间帮助避免的名称污染,也有using
帮助避免的可读性较差的限定名称;两者的缺点和两者都没有的优点。
另外,如何替换上面的代码?
正如您所说,如果std
的内容已转储到可访问的范围内,cin.ignore(numeric_limits::max(), 'n');
将起作用。但我仍然建议摆脱using
.
如果您已经努力在函数前面加上std::
那么通过拥有using namespace std;
实际上一无所获,但是从标准库命名空间中提取所有内容会带来缺点。绝对不要两者兼而有之。也不要using namespace std
放在头文件中,因为代码的用户可能不希望这样做。这样做是假设标头的用户没有任何与任何标准库名称冲突的名称,如果不是这种情况,那么这对您的用户来说是一种痛苦。
一般来说,我通常总是在前面加上std::
,以确保没有名称冲突。但是,如果您只是想减少键入,则可以显式地输入所需的名称。例如:
using std::cout;
cout << "foo";
在这种情况下,您可以通过引入所有内容来减少一些类型,而不会污染命名空间。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 删除前面元素并将新元素添加到最小堆 (std::p riority_queue)
- 将std::deque的现有元素推到前面
- 使用 std 命名空间,为什么(或为什么不)我应该在 std:: 前面加上前缀
- 当使用std::vector和std::list时,Linux内存使用排在最前面