为什么#include 只完成声明和定义?

why #include only complete declarations and definitions?

先生Bjarne Stroustrup 在他的书 "The C++ Programming Language Fourth Edition" 第 425 页中间 (§15.2.2) 中说:

It is wise not to be too clever about the use of #include. My recommendations are: ... include only complete declarations and definitions.

我不明白他是什么意思? 我看到很多代码使用 .h 文件作为声明,使用 .cpp 文件作为定义,然后只包含 .h 文件。 那么他的建议到底是什么意思?

如果我对 Stroustrup 的理解正确,这些是 "complete" 声明:

// foo.h
void foo();
struct S {
    int bar() const;
};

这些是 "incomplete" 声明,您不应该这样写 headers:

// bar_start.h
struct Bar {

// bar_end.h
};

做:

#include "foo.h"

不要:

#include "bar_start.h"
void foo();  // foo is a member of Bar
#include "bar_end.h"

我通过本书作者 (Bjarne Stroustrup) 的电子邮件询问了这个问题,以确定他的意思。 他回复:

Consider:

#define X foo
#include "essentials.h"

// ... the rest goes here

};

其中 essentials.h 是

class X {

    X();

    X(const X& a);

    X(X&&);

    // ... and more ...

The result of such "cleverness", spreading a definition across several files leads to unmaintainable messes.