【问题标题】:C++ Library Inclusion GuardsC++ 库包含防护
【发布时间】:2016-08-30 15:30:17
【问题描述】:

只是风格问题,甚至可能是我不知道的不当行为。

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

例如

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

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

【问题讨论】:

标签: c++ include libraries include-guards


【解决方案1】:

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

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

#pragma once
#ifndef HEADER_H
#define HEADER_H
//.....Code
#endif

您总是可以#pragma#define,(如1 或其他),但同时保证标头保护,因为旧编译器不支持#pragma once

【讨论】:

  • 在你给出答案后问题被编辑了吗?就目前而言,我既不真正理解这个问题,也不理解为什么当 OP 已经拥有警卫时你解释包含警卫
  • 这只是无关紧要的信息,以确保 OP 不必担心双重定义错误或双重包含错误@tobi303
  • 嗯好的。我的意思是,如果问题没有被编辑,似乎 OP 在没有真正理解它们的目的的情况下使用它们,你的解释根本无关紧要
  • 我主要包括它,因为其他答案也是如此
【解决方案2】:

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

没有。事实上,您应该包含您实际依赖的每个头文件。您不应依赖包含您的依赖项的其他标头。未能包含您需要的所有标题会导致错误。如果你的班级需要std::string,它应该包括&lt;string&gt;。时期。

所有标题都应该包含保护(无论是#ifndef 还是#pragma once 变体)。当然,您的标准库实现中的那些。所以额外包含的缺点只是边际额外的预处理时间,而好处是可以保证编译代码。

【讨论】:

    【解决方案3】:

    如果您在课堂上使用string,则必须包含它。由于string 也受到保护以防止多重包含,所以很好。

    顺便说一句,有一个比 ifdef 更好的方法来避免多重包含:

    #pragma once
    
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2018-07-20
    • 2014-03-30
    • 2013-11-13
    • 2015-12-31
    • 2019-10-05
    • 2023-01-21
    • 1970-01-01
    相关资源
    最近更新 更多