我听说using namespace std;
是不好的做法,应该直接使用std::cout
和std::cin
。这是为什么呢?是否会冒险声明与 std
命名空间中某些东西同名的变量?
我听说using namespace std;
是不好的做法,应该直接使用std::cout
和std::cin
。这是为什么呢?是否会冒险声明与 std
命名空间中某些东西同名的变量?
一个示例,在该示例中using namespace std
由于算法库中也存在函数count的歧义而导致编译错误。
#include <iostream>
#include <algorithm>
using namespace std;
int count = 1;
int main() {
cout << count << endl;
}
::count
--问题已解决。通常情况下,从std命名空间中获取的内容比其他地方多,因此保留using namespace指令可能会节省您的打字时间。 - Petr Skocik在你的源代码中加入命名空间并不会使你的软件或项目性能变差。包含 using namespace std
指令取决于你的需求和你开发软件或项目的方式。 namespace std
包含了 C++ 标准函数和变量,当你经常使用 C++ 标准函数时这个命名空间是很有用的。
如此页面所述:
using namespace std
语句通常被认为是不好的实践。替代这个语句的方法是每次声明类型时使用作用域操作符(::)来指定标识符所属的命名空间。还可以看看这个观点:
如果你经常使用该命名空间,并确定不会发生冲突,则在源文件中使用 "using namespace std" 没有问题。
有些人说在你的源文件中包含 using namespace std
是不好的实践,因为你会从该命名空间中调用所有函数和变量。当你想要定义一个与 namespace std
中另一个函数同名的新函数时,你会重载函数并可能会导致编译或执行问题。它不会按照你的期望编译或运行。
在某些情况下,程序可能仍然可以编译,但会调用错误的函数,因为我们从未指定标识符属于哪个命名空间。如此页面所述:
尽管这个语句节约了我们在访问 std 命名空间中定义的类或类型时输入 std:: 的时间,但它会将整个 std 命名空间导入程序的当前命名空间中。接下来看几个例子,以了解为什么这可能不是一件好事。
...
现在在开发的后期,我们希望使用在名为“foo”的某个库中自定义实现的另一个版本的 cout(例如)
...
注意到有一个歧义,cout 指向哪个库?编译器可能会检测到这一点并不编译程序。在最坏的情况下,运行结果可能会出现意外的错误。
using
的用处,但我个人更喜欢限制使用它。我也强烈考虑一些其他人指出的问题:std
命名空间中查找它(或反过来-您想要更改所有不在命名空间std
、命名空间X
等中的调用),那么您打算如何做?std::
前缀。我喜欢这种外观胜过没有它。我不知道是否因为它很明确,并告诉我“这不是我的代码...我正在使用标准库”,或者还有其他原因,但我认为它看起来更漂亮。这可能很奇怪,因为我最近才开始接触C++(长期使用和仍在使用C和其他语言,C是我最喜欢的语言之一,比汇编语言更好)。std::name
保留给标准库版本,而将name保留给特定于程序的实现。是的,确实可能会让你受到打击,但最终归结于我从头开始启动了这个项目,并且我是唯一的程序员。例如:我重载了std::string
并将其称为string
。我添加了一些有用的内容。我这样做部分原因是因为我倾向于使用小写名称的C和Unix(+ Linux)。std::regex
支持。当然,它可以编译,但会抛出类似于程序员端错误的异常。但它缺乏实现。namespace std
{
using boost::regex;
using boost::regex_error;
using boost::regex_replace;
using boost::regex_search;
using boost::regex_match;
using boost::smatch;
namespace regex_constants = boost::regex_constants;
}
我不会争论这是否是一个坏主意。但是我会争论它让我的项目更加清晰,同时使其更加具体:确实,我必须使用Boost,但是我正在像libstdc++最终将要用的那样使用它。是的,从标准库开始自己的项目并在一开始就使用它可以帮助维护、开发以及与项目相关的所有内容!
只是想澄清一些事情:我实际上并不认为在STL中故意使用类/其他名称是一个好主意,更具体地说是替代。字符串对我来说是个例外(忽略上面的第一个或第二个,如果你愿意),因为我不喜欢“String”的想法。
至于现在,我仍然非常偏爱C,偏见C ++。不多说,我所做的大部分工作都适合C(但这是一个很好的练习,也是让自己学会另一种语言,并尝试不那么偏见于对象/类等方面的好方法,这可能更好地表述为不那么心胸狭窄、不那么傲慢和更加接纳)。但是一些人已经提出了有用的建议:我确实使用list(它相当通用,不是吗?)和sort(同样的东西)来命名两个如果我要做using namespace std;
就会引起名称冲突的东西,所以为了达到这个目的,我更喜欢具体、可控,并且知道如果我打算将其作为标准使用,则必须指定它。简而言之:不允许假设。
至于使Boost的regex成为std
的一部分。我这样做是为了未来的集成 - 再次承认这完全是偏见 - 我认为它并不像boost::regex:: ...
那么丑陋。事实上,对我来说还有另一个问题。在C ++中有很多事情我仍然没有完全接受外观和方法(另一个例子:变长模板与var参数[虽然我承认变长模板非常非常有用!])。即使是我接受的那些,也很困难,而且我仍然有问题。
std
命名空间是未定义行为”,因此永远不应该这样做。 - tambre根据我的经验,如果你有多个库使用相同的 cout
,但是用途不同,你可能会使用错误的 cout
。
例如,如果我输入了 using namespace std;
和 using namespace otherlib;
,并只输入了 cout
(它恰好存在于两个库中),而不是 std::cout
(或 'otherlib::cout'
),那么你可能会使用错误的一个,从而产生错误。使用 std::cout
更加有效和高效。
如果导入的标识符不合格,您需要外部搜索工具(例如grep)来查找标识符的声明位置。这使得关于程序正确性的推理更加困难。
cout << hex << setw(4) << i << endl;
比 std::cout << std::hex << std::setw(4) << i << std::endl;
更易于阅读。 - oz1czstd::map<std::string,std::pair<std::string,std::string>>
相比于map<string,pair<string,string>>
非常糟糕。 - oz1cz我不认为在所有情况下都是不好的做法,但您需要小心使用。如果您正在编写一个库,您可能应该使用命名空间和作用域解析运算符来防止您的库与其他库产生冲突。对于应用程序级别的代码,我认为没有任何问题。
这是一种不良的做法,通常称为全局命名空间污染。当多个命名空间具有相同签名的函数名称时,可能会出现问题,此时编译器无法确定调用哪一个,但如果您在函数调用中指定命名空间,如std :: cout
,则可以避免所有这些问题。希望这有所帮助。:)
这取决于它所在的位置。如果它是一个常见的头文件,那么把它合并到全局命名空间中会降低命名空间的价值。请记住,这可能是一种使模块全局变量化的好方法。
using
命令,除非针对特定的命名空间,例如std::literals::chrono_literals
、Poco::Data:Keywords
、Poco::Units
等与字面值或可读性技巧有关的内容。无论是在头文件还是实现文件中都不应该使用。在函数作用域内可能还可以接受,但除了字面值和相关内容外都没有用处。 - Ludovic Zenohate Lagouardette