问题1:我认为你再次失踪的是“f2 包括f1”和“f2 是guaranteed以包括f1”。 对于标准负责人来说,这一点尤其重要,因为任何标准负责人都是allowed<>em>,以包括任何其他人员。 因此,如果你依赖间接手段,把这项工作列入你的机器,那么你的代码可能无法汇编不同的C++执行。
如果有一个“f2.h”文件表明或暗示它包含“f1.h”的图书馆,这意味着它始终将采用所有兼容版本,那么你可以依靠间接包括的内容。 如果你重新利用图书馆的一个部分,从根本上依靠该图书馆的另一个组成部分,但其他部分可能被其他用户孤立使用,你可以这样做。 例如,“xhtml_parser.h”可以合理地证明,它提供了“xml_parser.h”和一些额外定义的所有定义。
问题2:总而言之,你是否想重谈这个问题? “f2 包括f1和f2 ,包括f1”你所称的 is,没有“电弧联系”。 www.un.org/french/ecosoc 如果你写上头盔,那么,f1包括f2和f2, 包括f1, 则会造成问题,因为其中含有“链接”,它在很大程度上是其他头盔文件内容的削减和过去。
即便在图3出现之前,通知也可能有问题:
f1.h
----
#ifndef f1_h_included
#define f1_h_included
#include "f2.h"
struct DerivedA : BaseA {};
struct BaseB {};
#endif
f2.h
----
#ifndef f2_h_included
#define f2_h_included
#include "f1.h"
struct BaseA {};
struct DerivedB : BaseB {};
#endif
This isn t going to compile no matter which you include of "f1.h" and "f2.h". Assuming f1 is included first, the result after preprocessing looks like this:
// contents of f2.h, pasted in at line 4 of f1.h
// (contents of f1.h on the circular include are ignored due to include guard)
struct BaseA {};
struct DerivedB : BaseB {};
// rest of f1.h
struct DerivedA : BaseA {};
struct BaseB {};
And so Derived B具体规定了尚未界定的基类。 把它们放在另一个方面,与DerivedA一样。