C ++我是否必须为每个源文件包含标准库?

时间:2014-09-16 14:05:12

标签: c++ include header-files standard-library precompiled-headers

我现在有点困惑,因为我计划在我的一个项目中首次包含多个源文件和头文件。
所以我想知道这是否是正确的做法? 我是否必须在每个直接使用它的源文件中包含字符串标题? 那么" stdafx.hpp" Visual C ++希望我包含的标题?

这会是要走的路吗?

的main.cpp

#include "stdafx.hpp"
#include <string> //?
#include <stringLib1.h>
#include <stringLib2.h>
using std::string;

//use a windows.h function here
//use a stringLib1 function here
//use a stringLib2 function here

stringLib1.h

#include "stdafx.hpp"
#include <string>
using std::string;

class uselessClass1
{
public:
    string GetStringBack1(string myString);
};

stringLib1.cpp

#include "stdafx.hpp"

string uselessClass1::GetStringBack1(string myString) {
    return myString;
}

stringLib2.h

#include "stdafx.hpp"
#include <string>
using std::string;

class uselessClass2
{
public:
    string GetStringBack2(string myString);
};

stringLib2.cpp

#include "stdafx.hpp"

string uselessClass2::GetStringBack2(string myString) {
    return myString;
}

4 个答案:

答案 0 :(得分:4)

  1. 一个好的做法通常是只包含代码在每个文件中使用的内容。这减少了对其他头文件的依赖性,并且在大型项目上减少了编译时间(并且还有助于找出取决于什么的内容)

  2. 在标题文件中使用include guards

  3. 不要通过polluting全局命名空间导入所有内容,例如

    using namespace std;
    

  4. ,而是确定您打算在需要时使用的内容
  5. 您的项目unless you're using precompiled headers中不需要stdafx.h。您可以在VS项目属性中控制此行为( C / C ++ - &gt;预编译标题 - &gt;预编译标题

答案 1 :(得分:3)

如果在VS中启用了预编译标头,则需要stdafx.h标头。 (Read this one) 您只需要在stdafx.h文件中加入.cpp作为第一个包含。

关于header和cpp文件(成对出现),在头文件中包含声明所需的内容,并在cpp中包含其他所有内容(定义所必需的)。还包括其cpp对中的相应标头。并使用include guards

<强> myclass.h

#ifndef MYCLASS_H  // This is the include guard macro
#define MYCLASS_H

#include <string>
using namespace std;

class MyClass {
    private:
      string myString;
    public:
    MyClass(string s) {myString = s;}
    string getString(void) {return myString;}
    void generate();
}

<强> myclass.cpp

#include <stdafx.h>  // VS: Precompiled Header
// Include the header pair
#include "myclass.h" // With this one <string> gets included too
// Other stuff used internally
#include <vector>
#include <iostream>

void MyClass::generate() {
    vector<string> myRandomStrings;
    ...
    cout << "Done\n";
}

#endif

然后在main(...)中,您可以添加myclass.h并调用generate()函数。

答案 2 :(得分:0)

stdafx include应该位于每个.cpp文件的顶部,它不应该在.h文件中。 你可以把#include&lt;字符串&gt;在stdafx.h中,如果你不想把它放在每个其他文件中。

答案 3 :(得分:-1)

我认为您必须拥有自己的头文件,这可能是其他cpp文件和头文件中可能需要的。就像你给的那个

#include <stringLib1.h>
#include <stringLib2.h>

在我看来,最好创建一个通用头文件,其中包含所有公共库头文件和项目头文件。然后,您可以在此文件中包含所有其他cpp文件和头文件。而且最好还使用标题保护。

因此,考虑一个公共头文件&#34; includes.h&#34;。

#ifndef INCLUDES_H
#define INCLUDES_H

#include <string>

#include <stringLib1.h>
#include <stringLib2.h>

/***Header files***/    

#endif  //INCLUDES_H

这是您常用的头文件。这可以包含在所有项目文件中。