【问题标题】:How to test if a header has already been included before [duplicate]如何测试在[重复]之前是否已经包含标题
【发布时间】:2013-06-08 15:29:14
【问题描述】:

我正在做一个项目,但我被一个问题惊呆了。

我有 3 个libraries.h,其中包括另一个特殊的库,definitions.h,但是在我的主模块中,我想只包含一次所有的库,我的意思是,我想测试库 definitions.h 是否有已经被收录,收录与否视结果而定。

类似

If !(#include"definitions.h")
(#include"definitions.h")

【问题讨论】:

  • 在 C 中,头文件必须保护 它们自己 免受多重包含。像这样的东西:#ifndef HEADER_H #define HEADER_H ... #endif.
  • 一个不是#include libraries,而是headers 在编译后被链接。甚至在后者之前,我们#includeed libraries(s)' header(s) 通过预处理器。
  • 骗子,不是吗?

标签: c macros header-files


【解决方案1】:

您正在寻找include guards.

例子,

#ifndef DEFINITIONS_H 
#define DEFINITIONS_H 
...
...

#endif

【讨论】:

  • +1 击败我。
  • +1 打败我...添加更多解释...看来 OP 需要它...
  • +1 比我快。
  • +1 表示不使用以下划线+大写字母开头的标识符(未定义行为)
  • @kot_mapku3 它将包含两个标题。但是由于 已经通过 header2.h 包含,它不会通过 header1.h 包含(因为 中的包含保护会阻止这种情况)。所以 main.cpp 将有 3 个包括:)。
【解决方案2】:
#ifndef DEFINITIONS_H
#define DEFINITIONS_H
//lots of code
//
//
//
//
#endif

还有非标准的#pragma once,见Is #pragma once a safe include guard?

【讨论】:

    【解决方案3】:

    如果您的标题语法正确,这应该不是问题。其实这就是你写的原因

    #ifndef _DEFINITIONS_H
    #define _DEFINITIONS_H
    [header content]
    #endif
    

    所以,如果你的标题符合 C 约定,你应该没问题。

    【讨论】:

    • OT:有趣的是,我似乎是唯一一个在我的 #define 中使用前导下划线的人。
    • 这是未定义的行为,因为您使用的是以下划线+大写字母开头的标识符。这应该是DEFINITIONS_H。你似乎是唯一一个还没有看到光明的人:-)
    • 是的。它们不是要保留给编译器命名空间吗?
    • IOW,只要后面没有大写字母/下划线,前导下划线就可以了。编译器将来可以使用这种方法。参考:C11 草案 16.8.4:“任何其他预定义宏名称应以前导下划线开头,后跟大写字母或第二个下划线。”
    • 是的,我确定。 C 标准禁止使用保留标识符。下划线+大写始终保留用于任何命名空间中的任何 use =,即使在宏命名空间中也是如此。 Shaw 是错误的,因为他只是像在 /usr/include 的实现标头中找到它一样编写它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多