2011-02-16 65 views
0

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

可能吗?

+4

标题无法定义或未定义。你的意思是不定义一个以前的`#define`d值?那里有`#undef`指令。 – templatetypedef 2011-02-16 08:58:25

+0

如何使用#undef。我想取消定义#include“abc.h” – Sijith 2011-02-16 09:00:41

+0

也许你可以提供一个例子吗? – Nick 2011-02-16 09:01:56

回答

0

你不能做你想做的事情。如果你不想头包括你的选择是

不包括它摆在首位

有条件地包含或不通过prepocessor例如

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

或假设头部具有头部防护装置,只是在包含头部之前定义头部防护装置,从称道线-DMY_HEADER或类似

如果真正的问题是,你必须定义具有相同名称的东西不同的页眉,那么你可能需要考虑namespaces所以你没有得到冲突

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

你的意思是你想要确保头文件包含一次只有一次?标准解决方案是使用包括后卫

I.e.围绕您的标题的内容与

#ifndef MY_HEADER // a unique identifier for each header 
#define MY_HEADER 

... 

#endif 

这是保证在所有平台上都能正常工作。某些编译器还提供#pragma以获得相同的效果,并减少了麻烦。在Visual C++中,您可以添加

#pragma once 

位于头文件的开头。

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指令这是非常有用的。

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 */ 

使用这种策略,你可以使用预处理程序选择是否预先定义的后卫,甚至有内部警卫在你头。

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