我已经告诉别人,编写using namespace std;代码是错误的,我应该用std::cout和std::cin直接代替.
为什么被using namespace std;认为是不好的做法?是低效还是冒着声明模糊变量(与名称std空间中的函数具有相同名称的变量)的风险?它会影响性能吗?
我有C#几个项目的解决方案Visual Studio 2010.一个是测试项目(我将其称为" PrjTest "),另一个是Windows Forms Application项目(我将其称为" PrjForm ").还有一个由PrjForm引用的第三个项目,它能够成功引用和使用.
PrjForm引用PrjTest,而PrjForm有一个带有using语句的类:
using PrjTest;
Run Code Online (Sandbox Code Playgroud)
using 声明正确到位using PrjTest;出现错误:找不到类型或命名空间名称'PrjTest'(您是否缺少using指令或程序集引用?)
我尝试过以下方法来解决这个问题:
VS 2010我做完了我的功课,花了很长时间在线寻找答案,但这些解决方案都没有帮助.
我还能尝试什么?
c# reference using-directives using-statement visual-studio-2010
我喜欢将我的using指令放在当前命名空间内,而不是在外面,因为VS和Resharper默认放置它们.
有没有人知道一个宏/标准功能,它排除/删除未使用的using指令并将它们放在当前的命名空间中?
我有 C++ 背景,我完全理解并同意这个问题的答案:Why is “using namespace std;” 被认为是不好的做法?
所以我很惊讶,现在有了 C# 的一些经验,我看到了完全相反的情况:
using Some.Namespace;字面上到处都在使用。每当您开始使用类型时,首先为其命名空间添加 using 指令(如果它还没有的话)。我不记得看过一个.cs不以using System; using System.Collections.Generic; using X.Y.Z; etc.... 事实上,如果您通过 Visual Studio 向导添加一个新文件,它会自动在那里添加一些 using 指令,即使您可能根本不需要它们。因此,虽然在 C++ 社区中您基本上会受到私刑,但 C# 甚至鼓励这样做。至少在我看来是这样。
现在,我明白在 C# 和 C++ 中使用指令并不完全相同。另外,我确实明白,您可以using namespace在 C++ 中做的最讨厌的事情之一,即将它放在头文件中,由于缺乏头文件和#include.
然而,尽管存在差异,但在 C# 和 C++ 中使用指令的目的是相同的,只需一直输入SomeType,而不是更长的时间Some.Namespace.SomeType(在 C++ 中使用::而不是.)。出于同样的目的,对我来说,危险似乎也是一样的:命名冲突。
在最好的情况下,这会导致编译错误,因此您“只需”修复它。在最坏的情况下,它仍然可以编译,并且代码会默默地做与您预期不同的事情。所以我的问题是:为什么(显然)使用在 C# 和 C++ 中被认为如此糟糕的指令?
我对答案的一些想法(不过,这些都没有真正让我满意):
与 C++std相比,C# 中的命名空间往往更长,嵌套更多(vs. System.Collection.Generic)。因此,以这种方式对代码去噪有更多的愿望和更多的收获。但即使这是真的,这个论点也只适用于我们查看标准命名空间时。在 C# 和 …
请考虑以下代码:
struct A
{
void f()
{
}
};
struct B1 : A
{
};
struct B2 : A
{
};
struct C : B1, B2
{
void f() // works
{
B1::f();
}
//using B1::f; // does not work
//using B1::A::f; // does not work as well
};
int main()
{
C c;
c.f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我恳请你不要复制粘贴标准答案如何解决钻石问题("使用虚拟继承").我在这里问的是为什么在这种情况下使用声明不起作用.确切的编译器错误是:
In function 'int main()':
prog.cpp:31:6: error: 'A' is an ambiguous base of 'C'
c.f();
Run Code Online (Sandbox Code Playgroud)
我得到的印象是使用声明应该从这个例子开始:
struct A
{
void f()
{ …Run Code Online (Sandbox Code Playgroud) 我正在编写一个包含多个依赖模块的库.当我包含来自不同模块的文件时,我是否应该使用以下命令解析命名空间:
using namespace project1::namespace1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)
要么
typedef project1::namespace1::class1 class1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)
每种方法的优缺点是什么?我读到了我们应该typedef在.H文件和using.C文件中使用的地方,这是可取的吗?
我遇到的'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,则会导致名称空间不明确.
在我的C++ JSON库中,我最近使用GCC7进行了回归.我删除了受影响的代码,希望了解错误.
考虑这个标题myclass.hpp:
#pragma once
template <typename X>
struct A
{
struct value_t
{
X array;
};
static A array()
{
return A();
}
friend bool operator<(const A& lhs, const A& rhs) noexcept
{
return lhs.val.array < rhs.val.array;
}
value_t val = {};
};
Run Code Online (Sandbox Code Playgroud)
如您所见,我在struct中使用名称"array"作为成员变量名称value_t,作为静态函数的名称.然后我在以下文件中包含标题:
#include <array>
using std::array; // note this!
#include "myclass.hpp"
int main()
{}
Run Code Online (Sandbox Code Playgroud)
代码用GCC6和Clang5(使用-std=c++11)编译,但GCC7报告:
In file included from example.cpp:3:0:
myclass.hpp: In function 'bool operator<(const …Run Code Online (Sandbox Code Playgroud) 可能重复:
typedef和在C++ 11中使用有什么区别?
以下代码编译并运行.我的问题是"typedef"和"using"方法之间用于重命名模板特化的区别是什么?
template<typename T>
struct myTempl{
T val;
};
int main (int, char const *[])
{
using templ_i = myTempl<int>;
templ_i i;
i.val=4;
typedef myTempl<float> templ_f;
templ_f f;
f.val=5.3;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果没有差异,你更喜欢哪一个?/为什么引入使用... = ...版本?
所有学生都对 C++ using-directives的行为感到惊讶。考虑这个片段(Godbolt):
namespace NA {
int foo(Zoo::Lion);
}
namespace NB {
int foo(Zoo::Lion);
namespace NC {
namespace N1 {
int foo(Zoo::Cat);
}
namespace N2 {
int test() {
using namespace N1;
using namespace NA;
return foo(Zoo::Lion());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可能认为test会叫NA的foo(Zoo::Lion); 但实际上它最终会调用N1's foo(Zoo::Cat)。
原因是这using namespace NA实际上并没有将名称NA带入当前范围;它带来他们到最小共同祖先的范围NA和N2,这是::。并且using namespace N1不会将名称N1带入当前 …
我发现我的C++ 头文件很难用所有完全限定类型(比4个嵌套命名空间一样深)读取(并且输入真的很繁琐).这是一个问题(所有答案都提供了实现它的混乱替代方案,但这不是问题):是否有强烈的理由反对在C++语言的结构和类中引入作用域使用指令(尽管允许使用作用域 -功能声明)?
例如
class Foo : public Bar
{
using namespace System;
using namespace System::Network;
using namespace System::Network::Win32::Sockets;
using Bar::MemberFunc; // no conflict with this
// e.g. of how messy my header files are without scoped using-directive
void FooBar(System::Network::Win32::Sockets::Handle handle, System::Network::Win32::Sockets::Error& error /*, more fully-qualified param declarations... */);
};
Run Code Online (Sandbox Code Playgroud)
既然namespace是一个关键字,我会认为它足够明显,不会与使用声明的范围发生冲突,例如Bar::MemberFunc.
编辑:仔细阅读问题--->我加粗了.提醒:我们不是在讨论如何提高示例的可读性.提示using指令范围的中如何实现在C++语言(通过增加关键字/结构等手段IE)是不是一个答案(如果你能找到实现这个使用现有的C++语言标准的一个优雅的方式,那么它会的当然是一个答案)!
using-directives ×10
c++ ×8
c# ×2
c++11 ×2
namespaces ×2
c++-faq ×1
c++98 ×1
inheritance ×1
name-lookup ×1
rationale ×1
reference ×1
resharper ×1
std ×1
stdarray ×1
subclass ×1
typedef ×1