【问题标题】:C++ include guardC++ 包含守卫
【发布时间】:2012-01-19 00:22:58
【问题描述】:

所以我知道如何使用标准在我自己的头文件中放置包含保护

#ifndef ...
#define ...

现在,我的问题是关于包含不属于我自己的库。将是一个很好的例子。我有一个需要使用字符串的头文件,所以我执行以下操作

foo.h

#ifndef FOO_H
#define FOO_H

#include <string>

... code etc ...

#endif

现在,如果我有另一个名为 .. 的头文件,可以说 bar.h,这也需要使用 &lt;string&gt;,我怎样才能防止多个包含? STL 是否已经设置了 include 保护?

【问题讨论】:

    标签: c++ stl include-guards


    【解决方案1】:

    STL 库也有包含守卫,任何好的库都应该这样做。

    #ifndef _GLIBCXX_STRING
    #define _GLIBCXX_STRING 1
    

    这是来自 gcc 的

    【讨论】:

    • Microsoft 使用#pragma once - 他们专有的标头保护版本。这很好:“STL”现在是编译器的一部分,因此可以使用编译器特定的语言扩展。
    【解决方案2】:

    假设您所说的“STL”是指 C++ 标准库,那么您可以参考 C++ 标准。 §17.6.2.2/2 状态:

    一个翻译单元可以包含任何顺序的库头。每个都可以包含多次,与只包含一次没有任何不同,除了包含&lt;cassert&gt; 或&lt;assert.h&gt; 的效果每次都取决于 NDEBUG 的词法当前定义。

    这意味着没有必要防止同一个标头的多个包含。

    【讨论】:

      【解决方案3】:

      包括保护使用来保护保护对内的内容。您可以查看系统头文件string,它也有包含保护。所以,不用担心多个包含。

      【讨论】:

        猜你喜欢
        • 2019-04-25
        • 2017-07-31
        • 2013-06-22
        • 2017-11-21
        • 2011-01-24
        • 2022-01-22
        • 1970-01-01
        • 2015-03-04
        相关资源
        最近更新 更多