为什么#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.
先生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.