这个问题很奇怪。
假设我有一个名为idiot.cpp的文件,它的开头是:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <string>
#include <set>
#include <exception>
#include <iostream>
#include "idiot.h"

我有一个头文件idiot.h。首先,在idiot.h中,我也必须插入
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <string>
#include <set>
#include <exception>
#include <iostream>

还是我不?
第二,如果我还有另一个使用idiot.h的源文件,例如“bonito.cpp”,我应该只是#include "idiot.h"还是应该再次粘贴代码片段?
如果没有,有什么办法可以缩短它,这样我就不会在每个文件中包含大约20个 header 了? (假设)
抱歉,这是一个很愚蠢的问题,但是我不太经常使用很多 header 。

最佳答案

idiot.cpp无需包含idiot.h间接包含的任何内容即可进行编译。

更有趣的情况是:bonito.cpp #includeidiot.hidiot.h包括x.h。如果idiot.h仅将x.h的内容用于私有(private)或匿名 namespace 代码-且bonito.cpp也要使用x.h的内容,则bonito.cpp应直接(冗余地)包括x.h

理由很简单:idiot.h不能在不破坏客户端代码的风险的情况下从公共(public)/ protected 接口(interface)中删除某些内容,因此,如果发生这种情况,客户端必须期望处理它-可能还包括一个额外的 header 。但是,idiot.hidiot.cpp的维护者应可以自由更改idiot.h中的私有(private)或匿名 namespace 内容,而不必担心破坏客户端代码,包括包含哪些头文件来支持该私有(private)代码。

因此,包含在完成时是多余的,但是这样做的期望是随着idiot.h的发展它可能不再是多余的。

此最佳做法模型不会自动执行-您必须了解它的工作方式并主动对该模型进行编码。



如果idiot.h包含...

#include <string>
#include <vector>
...
class X {
    void add(const std::string&);
  private:
    std::vector<std::string> v_;
};

...然后bonito.cpp可以合理地使用std::string而不包含<string>,但如果需要<vector>,则应包括std::vector<>本身。

关于c++ - .cpp文件中可以包含(不包括)什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62140312/

10-11 19:08