回答
你不能做你想做的事情。如果你不想頭包括你的選擇是
不包括它擺在首位
有條件地包含或不通過prepocessor例如
#ifdef INC_MY_HEADER
#include "myheader.h"
#endif
或假設頭部具有頭部防護裝置,只是在包含頭部之前定義頭部防護裝置,從稱道線-DMY_HEADER或類似
如果真正的問題是,你必須定義具有相同名稱的東西不同的頁眉,那麼你可能需要考慮namespaces所以你沒有得到衝突
'包括'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
,但如果你不知道究竟你是這樣做會導致很多麻煩。如果你真正的問題是,你的編譯器抱怨'已經聲明的東西',那麼你沒有防範你的頭文件多個包含...
你的意思是你想要確保頭文件包含一次只有一次?標準解決方案是使用包括後衛。
I.e.圍繞您的標題的內容與
#ifndef MY_HEADER // a unique identifier for each header
#define MY_HEADER
...
#endif
這是保證在所有平臺上都能正常工作。某些編譯器還提供#pragma
以獲得相同的效果,並減少了麻煩。在Visual C++中,您可以添加
#pragma once
位於頭文件的開頭。
#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
指令這是非常有用的。
你可以停止包含頭文件 - 最簡單的方法是刪除或註釋掉#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 */
使用這種策略,你可以使用預處理程序選擇是否預先定義的後衛,甚至有內部警衛在你頭。
如果你真的只需要包含部分文件,最好將文件分成兩部分。
- 1. 在C++中包含標題時未定義的引用
- 2. 錯誤2061 - 當我包含標題時,類變成「未定義」
- 3. 自定義標題欄與包含標題的佈局
- 4. 自定義包含標籤
- 5. fstream包含但「ifstream未找到」和「標識符未定義」
- 6. 該類型已包含一個定義。
- 7. protobuf-net擴展:「已包含定義」
- 8. 隨機php包含腳本 - 時區未定義,未定義的數組或函數已經定義
- 9. 不包含GetDataFromNumber的定義但是我已經定義了它?
- 10. F_SEAL_SEAL未聲明,即使包含標題
- 11. Django:內置包含標籤與自定義包含標籤
- 12. 包含iOS 7中未顯示標籤的自定義UITableViewCell
- 13. 標準包含std C++庫之後未定義的符號
- 14. EJS.JS ReferenceError:未定義標題
- 15. btn.attr(「標題」)未定義
- 16. '標籤'不包含'ForeColor'的定義。
- 17. jquery定義包含內容的標籤
- 18. 定義包含「
- 19. 包含socket.io.js導致未定義'require'
- 20. 結果中包含「未定義」
- 21. PHP包含/未定義變量
- 22. 自定義ActionBar上的向上按鈕以包含標題
- 23. 標識符'n'未定義,'object'不包含此類成員
- 24. 未定義的參考 - 我包括正確的標題
- 25. viewmodel問題,「不包含定義」
- 26. 標題包含問題
- 27. 「標籤不包含文本定義」
- 28. Django自定義包含標籤
- 29. Google Maps API:未定義標記標題
- 30. 不含定義爲「包含」
標題無法定義或未定義。你的意思是不定義一個以前的`#define`d值?那裏有`#undef`指令。 – templatetypedef 2011-02-16 08:58:25
如何使用#undef。我想取消定義#include「abc.h」 – Sijith 2011-02-16 09:00:41
也許你可以提供一個例子嗎? – Nick 2011-02-16 09:01:56