2013-07-27 61 views
3

我有代碼的結構是這樣的:的#include循環依賴錯誤

RESOURCE.H:

#include"a.h" 
#include"b.h" 
#include"c.h" 

啊:

#ifndef __A__ 
#define __A__ 
#include"resource.h" 
class B; 
class A{ 
//something uses B 
}; 
#endif 

BH:

#ifndef __B__ 
#define __B__ 
#include"resource.h" 
class A; 
class B{ 
//something uses A 
} 
#endif 

CH:

#ifndef __C__ 
#define __C__ 
#include"resource.h" 
class A; 
class B; 
class C{ 
//something uses A and B 
}; 
#endif 

問題是:VS2010告訴我,在c.h中,行#include「resource.h」導致「resource.h」包含自身。

但是,代碼能夠按照預期進行編譯和執行。所以我想知道是什麼原因導致這個錯誤intellisense在VS中,如果有無論如何刪除它。

P.S:我用VS編譯,沒有編譯錯誤。

+1

用* Errorr *編譯? –

+0

我猜你的問題不在你已經發布的代碼中,而是關於你實際包含的具體內容。 – Joe

+4

請勿使用帶有雙下劃線的標識符;它們被保留供實施使用。 –

回答

1

您不必在resource.h頭後衛:

#ifndef __RESOURCE__ 
#define __RESOURCE__ 1 
#include "a.h" 
#include "b.h" 
#include "c.h" 
#endif 

但是,不建議雙下劃線,爲他們預留了實現。所以我會用{PROJECTNAME}_RESOURCE_H。這也將防止與其他不這樣做的項目碰撞。

看到你正在使用Visial Studio,我會建議你不要使用標頭警衛,而應該使用#pragma once如果你的項目沒有進行,我將使用gcc進行編譯。

+0

嗨,似乎在「resource.h」添加標頭警衛(以任何方式)阻止a和b看到對方。沒有標識符錯誤會出現。 –

+0

你顯然做錯了。在你的問題中發佈與這個問題相關的所有東西。不要減少代碼。如果相關,請發佈。這聽起來像你在隱藏我們的東西。 –

+0

我很抱歉我在這篇文章中做出的混淆。標識符錯誤的原因來自前向聲明。不過,您的添加標頭警衛的建議正在發揮作用,並且解決了自我包含問題。謝謝。 –

0

您可以使用#pragma once預處理器使resource.h在編譯時僅包含一次。

+0

這不回答這個問題。 –

+0

「所以我想知道是什麼原因導致了VS中的這個錯誤intellisense,並且如果有的話刪除它。」什麼原因已被編譯器告知,我的帖子回答如何解決(因此刪除)它。 –

+0

很明顯,他在resource.h中沒有使用任何警戒。我不知道GCC中可能會導致編譯問題。 –

0

c.h包括resource.h然後本身包括a.hb.h其中每個又包括resource.h

0

您正在創建循環依賴關係。 在resource.h中,你已經包含了a.h,b.h和c.h,這是不需要的。 類文件需要資源,資源文件不需要類信息。