2010-04-20 45 views

回答

8

如果你不關心可移植性,VC++中的__if_exists語句可以滿足你的需求。

5

在預處理階段沒有這樣的事情,所以沒有宏。

但是,您可以查看is_class類型特徵available in Boost或C++ 0x,使您可以在編譯時做出決定。

+2

我認爲這裏的問題是'Namespace :: MyClass'必須聲明爲某些東西,即使它不是一個類? – UncleBens 2010-04-20 17:35:09

+0

我想包括文件,根據知識,如果一些類已經定義。 – 2010-04-20 18:10:16

+0

@topright:但是爲什麼?如果你不小心,有幾種方法可能會有問題。 – 2010-04-20 19:19:20

9

編號預處理指令和宏由預處理器評估,預處理器在代碼被解析爲C++之前完成其任務。預處理器不瞭解類或名稱空間。

5

這是不可能的,但您可以使用include guard常量來驗證該類是否已包含在內。

+0

是的,確實如此。但這不是真正的解決方案。 – 2010-04-20 18:08:21

+0

要什麼問題? – soulmerge 2010-04-21 16:25:08

2

對我來說,聽起來好像是測試一下包含你正在尋找的類定義的頭文件是否包含在內,而不是試圖查看該類是否存在。這真的很容易檢查這一點,如果你已經實現定義每個頭文件中的符號的標準,如圖所示:

// myfile.h 

#ifndef _MYFILE_H_ 
#define _MYFILE_H_ 

// CODE 

#endif // _MYFILE_H_ 

你最好的選擇雖然是剛剛確定被包含在你的頭文件正確的順序在第一位。最簡單的方法是製作一個「整體」頭文件,該文件包含所有需要按正確順序排列的頭文件。只需將其包含在項目中的每個源文件中,即可順利完成。這不一定是最好的解決方案,但它是最簡單的。