C++ C++;图书馆包容卫士

C++ C++;图书馆包容卫士,c++,include,libraries,include-guards,C++,Include,Libraries,Include Guards,只是一个风格问题,甚至可能是一个我不知道的弊端 我目前正在编写我的第一个软件,它将由我以外的人使用和审查。当我编写代码并调用头文件时,跨文件多次调用同一头文件是一种不好的做法 比如说 示例class.h #ifndef BUG_H #define BUG_H #include<string> class Bug{ private: int bug_id; //6 digit int Date creation_ts; //Date object containing

只是一个风格问题,甚至可能是一个我不知道的弊端

我目前正在编写我的第一个软件,它将由我以外的人使用和审查。当我编写代码并调用头文件时,跨文件多次调用同一头文件是一种不好的做法

比如说

示例class.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
#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
\ifndef BUG\u H
#定义错误
#包括
类错误{
私人:
int bug_id;//6位int
创建日期\u ts;//包含创建时间的日期对象
std::string short_desc;//错误的简短描述
std::string classification;//bug\u id的分类
std::string product;//错误涉及的是什么产品
字符串组件
}
#恩迪夫
另一个示例.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
#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
#如果使用另一个示例#
#定义另一个示例
#包括
帕格班{
私人:
int bug_id;//6位int
创建日期\u ts;//包含创建时间的日期对象
std::string short_desc;//错误的简短描述
std::string classification;//bug\u id的分类
std::string product;//错误涉及的是什么产品
字符串组件
}
#恩迪夫

如果两个头文件都有依赖项,那么在两个不同的头文件中包含两次字符串是否有什么问题?这是否会在软件生命周期的后期导致错误?

如果这两个文件不相关,例如不包含在同一个源中,则您别无选择。否则,这并不重要,因为如果您一个接一个地包含一个文件,
无论如何都会被包含。其中一个文件仍然需要它。但是,如果一个文件需要一个文件,总是包含它。总有这样的风险,有人可能会忘记包含另一个文件,而代码将无法编译。不要冒险,相信客户

另外,
std::string
也有include-guard,所以不必担心多重包含。此外,为了安全起见,您可以在标题中执行以下操作:

#pragma once
#ifndef HEADER_H
#define HEADER_H
//.....Code
#endif
您可以始终使用
#pragma
#define
,(如1或另一个),但同时使用这两种保证头保护,因为旧编译器不支持
#pragma一次

如果两个头文件都有依赖项,那么在两个不同的头文件中包含两次字符串是否有什么问题?这会不会在软件生命的后期导致错误

不可以。事实上,应该包含实际依赖的每个头文件。您不应该依赖于包含依赖项的其他标题。未能包含所需的所有标题会导致错误。如果您的类需要
std::string
,它应该包括
。句号


所有标题都应包含防护装置(无论是
#ifndef
还是
#pragma once
变体)。当然,您的标准库实现中的那些是这样做的。因此额外include的缺点是额外的预处理时间,其优点是保证编译代码。

如果您在类中使用它,您必须包含
string
。因为
字符串
也可以防止多重包含,所以这很好

顺便说一句,有一种比IFDEF更好的方法来避免多重夹杂物:

#pragma once

很可能
有自己的问题。在您给出答案后,问题是否经过编辑?就目前而言,我既不真正理解这个问题,也不理解为什么在OP已经准备好了包含防护装置时,您会解释它们。这只是无关的信息,以确保OP不会担心dobule定义错误或双重包含错误@tobi303hm ok。我的意思是,如果问题没有经过编辑,OP似乎在使用它们时没有真正理解它们的目的,而你的解释也不是无关紧要的。我主要包括了它,因为其他答案都是,也请参见