C++ 库包含保护
C++ Library Inclusion Guards
只是风格问题,也可能是我不知道的不当行为。
我目前正在编写我的第一个软件,将由我以外的人使用和审查。当我编写代码并调用我的 header 时,跨文件多次调用相同的 header 是一种不好的做法吗?
例如
exampleClass.h
#ifndef BUG_H
#define BUG_H
#include<string>
class Bug{
private:
int bug_id; //6 digit int
Date creation_ts; //Date object containing time of creation
std::string short_desc; //Short description of bug
std::string classification; //Catagory of bug_id
std::string product; //What product is the bug regarding
std::string component
}
#endif
anotherExample.h
#ifndef ANOTHEREXAMPLE_H
#define ANOTHEREXAMPLE_H
#include<string>
class Pug{
private:
int bug_id; //6 digit int
Date creation_ts; //Date object containing time of creation
std::string short_desc; //Short description of bug
std::string classification; //Catagory of bug_id
std::string product; //What product is the bug regarding
std::string component
}
#endif
如果两个不同的 header 文件都有依赖关系,那么在两个不同的 header 文件中两次包含字符串有什么问题吗?这会在软件生命周期的后期导致错误吗?
如果这两个文件不相关,例如不包含在同一来源中,那么您别无选择。否则,这并不重要,因为 <string>
无论如何都会被包含,如果你一个接一个地包含文件。其中一个文件仍然需要它。但是,如果一个文件需要一个文件,总是 包含它。总有一次有人可能忘记包含另一个文件的风险,代码将无法编译。不要冒险,相信客户。
另外,std::string
也有include guards,不用担心多重包含。此外,为了安全起见,您可以在您的 header 中执行此操作:
#pragma once
#ifndef HEADER_H
#define HEADER_H
//.....Code
#endif
你总是可以 #pragma
或 #define
,(如 1 或其他),但是把两个保证 header 守卫,因为旧的编译器不支持 #pragma once
Is there anything wrong with including string twice in two different header files if both have dependencies? Will this cause errors later in the software's life?
没有。事实上,您 应该 包含您实际依赖的每个 header 文件。您不应该依赖包含您的依赖项的其他 header 。未能包含您需要的所有 header 导致错误。如果您的 class 需要 std::string
,它应该包括 <string>
。时期。
所有 header 都应该包含守卫(无论是 #ifndef
还是 #pragma once
变种)。当然,您的标准库实现中的那些可以。所以额外包含的缺点只是边际额外的预处理时间,而好处是保证编译代码。
如果要在 class 中使用它,则必须包含 string
。由于 string
也受到防止多重包含的保护,所以很好。
顺便说一句,有一种比 ifdef 更好的方法来避免多重包含:
#pragma once
只是风格问题,也可能是我不知道的不当行为。
我目前正在编写我的第一个软件,将由我以外的人使用和审查。当我编写代码并调用我的 header 时,跨文件多次调用相同的 header 是一种不好的做法吗?
例如
exampleClass.h
#ifndef BUG_H
#define BUG_H
#include<string>
class Bug{
private:
int bug_id; //6 digit int
Date creation_ts; //Date object containing time of creation
std::string short_desc; //Short description of bug
std::string classification; //Catagory of bug_id
std::string product; //What product is the bug regarding
std::string component
}
#endif
anotherExample.h
#ifndef ANOTHEREXAMPLE_H
#define ANOTHEREXAMPLE_H
#include<string>
class Pug{
private:
int bug_id; //6 digit int
Date creation_ts; //Date object containing time of creation
std::string short_desc; //Short description of bug
std::string classification; //Catagory of bug_id
std::string product; //What product is the bug regarding
std::string component
}
#endif
如果两个不同的 header 文件都有依赖关系,那么在两个不同的 header 文件中两次包含字符串有什么问题吗?这会在软件生命周期的后期导致错误吗?
如果这两个文件不相关,例如不包含在同一来源中,那么您别无选择。否则,这并不重要,因为 <string>
无论如何都会被包含,如果你一个接一个地包含文件。其中一个文件仍然需要它。但是,如果一个文件需要一个文件,总是 包含它。总有一次有人可能忘记包含另一个文件的风险,代码将无法编译。不要冒险,相信客户。
另外,std::string
也有include guards,不用担心多重包含。此外,为了安全起见,您可以在您的 header 中执行此操作:
#pragma once
#ifndef HEADER_H
#define HEADER_H
//.....Code
#endif
你总是可以 #pragma
或 #define
,(如 1 或其他),但是把两个保证 header 守卫,因为旧的编译器不支持 #pragma once
Is there anything wrong with including string twice in two different header files if both have dependencies? Will this cause errors later in the software's life?
没有。事实上,您 应该 包含您实际依赖的每个 header 文件。您不应该依赖包含您的依赖项的其他 header 。未能包含您需要的所有 header 导致错误。如果您的 class 需要 std::string
,它应该包括 <string>
。时期。
所有 header 都应该包含守卫(无论是 #ifndef
还是 #pragma once
变种)。当然,您的标准库实现中的那些可以。所以额外包含的缺点只是边际额外的预处理时间,而好处是保证编译代码。
如果要在 class 中使用它,则必须包含 string
。由于 string
也受到防止多重包含的保护,所以很好。
顺便说一句,有一种比 ifdef 更好的方法来避免多重包含:
#pragma once