Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;,MCVS 2012,头文件、向量和名称空间_C++_Visual Studio_Header_Namespaces_Include - Fatal编程技术网

C++ c++;,MCVS 2012,头文件、向量和名称空间

C++ c++;,MCVS 2012,头文件、向量和名称空间,c++,visual-studio,header,namespaces,include,C++,Visual Studio,Header,Namespaces,Include,我很难找到问题(Q)的答案,所以我在这里注册是为了问你们它到底是如何工作的(或不工作的);) 我在C++中编写,在VisualStudio 2012中,但仍然不知道在头文件中,包含了包含、命名空间等。我甚至需要使用它们吗 (Q1):假设我有一个.cpp文件和几个.h文件,它们正在使用,例如:vectors、things from和一些其他库,但我不写#include在头文件中,只写在.cpp中。对吗?或者我应该在每个标题中包含我使用的所有内容吗 通常每件事都对我有效,我甚至可以说它总是“有效”,

我很难找到问题(Q)的答案,所以我在这里注册是为了问你们它到底是如何工作的(或不工作的);)

我在C++中编写,在VisualStudio 2012中,但仍然不知道在头文件中,包含了包含、命名空间等。我甚至需要使用它们吗

(Q1):假设我有一个.cpp文件和几个.h文件,它们正在使用,例如:vectors、things from和一些其他库,但我不写#include在头文件中,只写在.cpp中。对吗?或者我应该在每个标题中包含我使用的所有内容吗

通常每件事都对我有效,我甚至可以说它总是“有效”,因为我还没有太多的经验,我通常将每件事都包含在一个.cpp和1或2个带有一些void函数的标题中。但我不知道它是否可以工作,因为它应该工作,或者因为,例如,mu编译器允许这样做,并且在某些问题上它可能会导致错误

(Q2):现在是关于使用名称空间std的事情; 在某些情况下,.h文件中的函数可以在没有它的情况下工作,但有时不能。例如,正在使用的空洞(仅用于合并排序的简单空洞):

\ifndef LISTA\u 1\H
#定义列表a_1_H
#包括“Lista_0_Zadanie_1.h”
无效合并(向量&A、整数p、整数q、整数r)
{
int i=p;
int j=q+1;
内部长度=r-p+1;
int k=0;
向量合并;
合并。分配(长度,0);
而((iQ1)您是否需要
#包含具有完整定义的头取决于您是否需要完整定义,或者是否只需要向前声明。如果只需要向前声明,则只需告诉编译器某个对象的名称。例如,如果您需要指向某个对象的指针:

// fw-decl Foo
class Foo;

// define Gizmo
class Gizmo
{
public:
  void DoIt();
  Foo* mFoo;  // just need a pointer, so don't need a full definition of foo
};
稍后,如果实际使用
Foo
对象,则需要完整的定义,如下所示:

#include "foo.h"
#include "gizmo.h"

void Foo::DoIt()
{
  mFoo->DoSomething(); // now we need a full definition
}
另一方面,如果编译器需要知道例如
Foo
有多大,则需要完整的定义

#include "foo.h"

class Gizmo
{
public:
  Foo mFoo;  // need a full definition here
};
一般来说,最好仅在必要时提供完整的定义,以尽可能缩短编译时间

Q2)简化的经验法则:永远不要
使用名称空间std
。如果你只是遵循这条经验法则而不去考虑它,你将永远不会遇到名称空间冲突、污染全局名称空间或其他不好的问题

当然,对于那些真正以思考为生的人来说,这条经验法则有点过于简化了,所以这里有一条稍微好一点的规则:

1) 绝不在头中使用命名空间

2) 永远不要在源文件中使用命名空间,除非您正在实现自己的命名空间

经验法则可能会过于严格,这也不例外,但它会让您在不冒太大风险的情况下走上正轨。使用Mespace的
问题在于它会将该命名空间中的任何内容带入全局范围。假设您有自己的头文件:

mystring.h …然后在源文件中:

#include "mystring.h"
#include <string>

using namespace MyString;
using namespace std;

string s;  // OOPS:  which "string" is this?  MyString::string, or std::string?
#包括“mystring.h”
#包括
使用名称空间MyString;
使用名称空间std;
string s;//OOPS:这是哪个“string”?MyString::string还是std::string?
这种模糊性在这里很明显,但在现实世界中却不那么明显,并导致一些很难检测到的错误。

(Q1)记住包含声明的实际作用很重要。基本上,它只不过是新文件中包含的整个文件的简单复制/粘贴

由于头文件包含在许多地方,因此通常不赞成在.h文件中包含许多不必要的包含(除非使用模板)。通常,当转发声明足够时,不要包含在头文件中

在.cpp文件中,包括程序可以编译所需的所有文件

因为您使用的是visual studio,所以必须小心,因为它对包含标准库中您实际上忘记包含的文件非常宽松,并且在其他系统上编译时可能会遇到问题

(Q2)在头文件中,您不应该有“using”语句。请记住,include语句是一个简单的复制/粘贴语句;因此,如果您有using语句,它也将包含在新文件中

在.h文件中,应始终使用std::vector、std::set等

在.cpp文件中,可以使用名称空间std、std::vector等


(侧栏)与您的代码相关,您应该将其分为头文件和cpp文件。在.h文件中没有定义,只有声明。创建一个.cpp文件并在其中定义算法。在.cpp文件中也没有定义保护。永远不要包含.cpp文件!

始终至少在头文件中使用
std:
。为了澄清,另一种方法是@chris所说的是:“永远不要在标题中使用命名空间std
”,你应该分别问多个问题,感谢你所有启发性的答案:)(当我有足够的声誉时,我会投票支持他们。)我会开始使用前缀,并小心我包括的内容和位置。
#include "foo.h"

class Gizmo
{
public:
  Foo mFoo;  // need a full definition here
};
namespace MyString
{
    class string
    {
      // ...
    };
}
#include "mystring.h"
#include <string>

using namespace MyString;
using namespace std;

string s;  // OOPS:  which "string" is this?  MyString::string, or std::string?