在头文件和cpp文件中同时包含一个库

5
我是一个新手C++程序员。我看过一些代码,包含了一个库文件(比如string),这个库文件同时在头文件和cpp文件中出现。如果不使用#ifndef,这会导致重复的代码吗?还是预处理器足够智能,可以忽略它。在两个文件中都包含同样的库文件是正常的吗?
test.h
#include <string>
.
.
.

test.cpp

#include <string>
#include "test.h"
.
.
.


2
<string>将有它自己的ifndef保护。 - Sam Varshavchik
此外,除非你需要<string>头文件中的某些东西,否则通常只需将其包含在实现文件中。 - Devan Buggay
2个回答

3
在两个文件中包含相同的库是正常的吗?
是的。在多个文件中包含头文件是正常的。
每当你使用头文件中的声明时,都应该包含该头文件。如果你在test.h中使用了std::string,那么你应该在test.h中包含<string>。如果你在test.cpp中使用std::string,那么你应该在test.cpp中包含<string>。无论<string>是否包含在由test.cpp包含的头文件中都是不相关的,这是不应该依赖的。
如果没有使用#ifndef,这样做会导致重复代码吗?
如果头文件没有头文件保护,那么多次包含它确实会导致其内容被复制。
还是预处理器足够聪明,可以忽略它?
预处理器不会忽略任何包含。每个包含都将被处理。预处理器可能足够聪明,能优化因为包含保护而为空的头文件的包含。

2
所有的C++标准库头文件都有ifndef保护。可以在多个文件中安全地包含它们。
经验法则是在需要其定义的每个地方都要包含该文件。这意味着如果您在h和cpp文件中都使用了std::string,则应在两个文件中都包含<string>
对于任何您自己的头文件,您应始终使用ifndef保护以达到相同的目的。

assert.hcassert没有包含保护。它们可以在不同的位置被多次包含,根据头文件包含时宏NDEBUG是否定义,会产生不同的效果。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接