2011-02-16 39 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 */ 

使用這種策略,你可以使用預處理程序選擇是否預先定義的後衛,甚至有內部警衛在你頭。

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