2012-03-14 52 views
3

這是一個奇怪的問題,我想知道是否有其他人看過。我們正在爲Mac和PC編寫跨平臺的C++代碼,並且這隻發生在Mac上。強制在Mac上使用C++代碼的正向聲明(使用Xcode)

說我有一個類,其.h文件看起來像這樣。

class X { 
public: 
    int _myValue; 
    void myFunction(); 
} 

我有另一個類,它的.h文件看起來像這樣:

#include "X.h" 
class Y { 
private: 
    X _myObj; 
} 

這不會編譯。我們得到一個錯誤,指出X未定義。解決方案是在Y.h文件中爲X添加前向聲明,如: class X;

我們已經做了一段時間,但現在我們正在進入情況不那麼好。例如,如果我們有一個.h文件,該文件在.h文件中定義了一個模板方法,並且該方法在另一個類中引用了一個方法,編譯器不知道任何關於它的信息。同樣,如果我們引用一個在包含的類中定義的枚舉,編譯器不會識別它(解決此問題的方法是將枚舉放在單獨的.h文件中,並且它很好地撿起了它)。

這是幾乎一樣,如果在編譯.cpp文件編譯器是不是從包含的.h文件中的數據拉。

我只是想知道是否有人看到過這樣的事情,或者有可能調查的途徑。

許多感謝...

+0

'#include」Xh「'或''include」xh「'?你是否收到任何警告,如」找不到'X.h'「? – 2012-03-14 17:07:17

+1

你能發表一個實際的(包括cpp文件)?當我嘗試編譯頭文件時,編譯器正確地抱怨說你的類聲明在最後缺少分號。當我解決這個問題時,代碼編譯得很好在Mac OS上使用gcc 4.2(我懷疑是你的實際頭文件包含了包含保護或'#pragma once',並且你的問題與此有關。) – 2012-03-14 17:10:49

+0

你可能想看看你是否有舊的副本Xh頭文件是由編譯器代替的,而不是最新的頭文件。 – 2012-03-14 18:32:24

回答

0

對於你的第一個問題(類),正確的答案是使用前向聲明。您應該避免將項目包含文件包含在其他項目包含文件中。這可以創建包含循環(如果必須猜測,這很可能是您的問題)。修改標題時,它也會造成過多的內部流失。

對於您的其他問題(枚舉,模板),這通常是由於包含循環。儘可能避免包含這些週期是您最好的選擇。

有關此問題和最佳做法的更多討論,請參閱Header file best practices for typedefs

+1

Y.h中的前向聲明(僅)不適用,因爲X顯示爲Y的值成員。需要完整的X定義。 – 2012-03-14 19:18:13

+0

你在這種情況下絕對正確。你應該儘可能避免包含*,但正如你注意到的,在這種情況下是不可能的。 – 2012-03-14 19:27:37

1

有一個共同的系統頭文件X.h這是X11窗口工具包的一部分。我建議更改頭文件的名稱,以免它與任何系統頭文件衝突。

你可以試着改變你的編譯器開關,迫使它考慮包含頭文件之前,您的系統包含目錄的目錄,但是這可能是更省力,更脆弱。

0

我只是淡淡的驚訝,沒有人提到了包括文件,如規範方案,

了foo.h:

#ifndef FOO_H 
#define FOO_H 
// body of the include file 
#endif 

我懷疑,在這種特定的情況下, 「xh」和「Xh」的衝突可能是你所看到的問題,但是如果你不保護這樣的包含文件,它最終會咬你咬你。

隨着守衛,你可以包括「X。h「在任何你需要它的地方