C ++ Library Inclusion Guards

时间:2016-08-30 15:30:18

标签: c++ include libraries include-guards

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

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

例如

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

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

3 个答案:

答案 0 :(得分:2)

如果这两个文件不相关,例如不包含在同一个源中,那么您别无选择。否则,它并不重要,因为如果你将一个文件包含在另一个文件中,那么无论如何都会包括<string>。其中一个文件仍然需要它。但是,如果一个文件需要一个文件,总是包含它。总有一种情况是有人可能忘记包含其他文件,并且代码不会编译。不要冒险,信任客户。

此外,std::string也包括警卫,因此无需担心多重包含。此外,为了确保包含,您可以在标题中执行此操作:

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

你可以随时#pragma#define,(如1或其他),但两者都保证标题保护,因为旧的编译器不支持#pragma once

答案 1 :(得分:1)

  

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

没有。实际上,应该包含您实际依赖的每个头文件。您不应该依赖包含您的依赖项的其他一些标头。它未能包含导致错误的所有标头。如果您的课程需要std::string,则应该包含<string>。期。

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

答案 2 :(得分:1)

如果您在班级中使用string,则必须加入string。由于#pragma once 也可以防止多次包含,因此很好。

BTW有一种比ifdefs更好的方法来避免多个包含:

/wp-contents/themes