这个问题很奇怪。
假设我有一个名为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
#include
的idiot.h
和idiot.h
包括x.h
。如果idiot.h
仅将x.h
的内容用于私有(private)或匿名 namespace 代码-且bonito.cpp
也要使用x.h
的内容,则bonito.cpp
应直接(冗余地)包括x.h
。
理由很简单:idiot.h
不能在不破坏客户端代码的风险的情况下从公共(public)/ protected 接口(interface)中删除某些内容,因此,如果发生这种情况,客户端必须期望处理它-可能还包括一个额外的 header 。但是,idiot.h
和idiot.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/