Undefine已包含标题

时间:2011-02-16 08:56:32

标签: c++ c visual-c++

我想检查源文件中的标题,如果已定义,我想取消它。

有可能吗?

5 个答案:

答案 0 :(得分:1)

'包含'c / c ++中的内容实质上意味着:制作preprocessor副本并将#include <file>直接粘贴到源代码中(或者更好:源代码的预处理版本)。

您无法撤消该复制和粘贴操作。但是你可以通过复制和粘贴操作引入'#undef'的东西,但是你必须为你不喜欢的每个原子做这个,你不能#undef整个文件。

要检查,如果已包含给定标头,则检查是否已定义该头文件中的某些内容。大多数标题包含所谓的“警卫”,看起来像

 #ifndef FOO_H
 #define FOO_H
 /* lots of code */
 #endif

表示名为'foo.h'的文件。你可以这样检查'FOO_H':

 #ifdef FOO_H
 /* do your magic */
 #endif

示例:

 foo.h:
 #ifndef FOO_H
 #define FOO_H
 struct Foo { /* ... * };
 #endif

 bar.h:
 #include "foo.h"
 #ifdef FOO_H
 #undef Foo
 #endif

如果您不知道自己到底在做什么,那可能会导致很多麻烦。如果您真正的问题是,您的编译器抱怨“已经声明的东西”,那么您不会在多个包含中保护您的头文件......

答案 1 :(得分:1)

您是说要确保头文件只包含一次吗?标准解决方案是使用 include guard

即。用

包围标题的内容
#ifndef MY_HEADER // a unique identifier for each header
#define MY_HEADER

...

#endif

这保证适用于所有平台。一些编译器还提供#pragma以实现相同的效果,减少麻烦,例如在Visual C ++中,您可以添加

#pragma once

在头文件的开头。

答案 2 :(得分:1)

#undef#define相反,实际上取消了它。

当您需要某个任务的宏但不希望“污染”符号表时,它非常有用

// referencing FOO is an error (not yet defined)

#define FOO(arg_) ....

FOO(A)
FOO(B)
FOO(C)

#undef FOO

// referencing FOO now is an error (not defined)

无法取消#include指令。

答案 3 :(得分:0)

你无法做你想做的事。如果您不希望包含的标题是您的选择

首先不要包含它

通过预处理器有条件地包括它,例如

#ifdef INC_MY_HEADER
#include "myheader.h"
#endif

或假设标题具有标题保护仅在包括标题之前定义标题保护,例如来自推荐行-DMY_HEADER或类似的

如果真正的问题是你有不同的标题来定义具有相同名称的东西,那么你可能需要调查namespaces,这样你就不会发生冲突

答案 4 :(得分:0)

您可以停止包含标题 - 最简单的方法是删除或注释掉#include指令。

您还可以预先定义您的警卫,以便包含无效。

foo.h
#ifndef __FOO_H
#define __FOO_H

/* contents of foo.h */

#endif /* __FOO_H */


foo.cpp
#define __FOO_H
#include "foo.h"
/* contents of foo.cpp */

使用此策略,您可以使用预处理器选择是否预先定义防护,或者甚至在头部内部设置内部防护。

如果你真的只需要包含部分文件,最好将文件分成两部分。