2010-05-19 62 views
2

我正在製作一個小型C++框架,其中包含許多.h和.cpp文件。C++頭文件保護問題

我創建了一個一般包括包括我所有的.h文件中,如:

framework.h 

#include "A.h" 
#include "B.h" 
#include "C.h" 

每個.H頭與保護包括後衛如

#ifndef A_HEADER 
#define A_HEADER 
... 
#endif 

的一個問題是,我希望能夠在所有sub.h中包含「framework.h」,但會導致大量編譯器錯誤:

#ifndef A_HEADER 
#define A_HEADER 

#include "framework.h" 
... 
#endif 

如果我使用真正的頭文件爲每個子標題,並使用我的框架framework.h它工作正常..

我只想包括所有我的sub .h所以主頭我不需要每次都包含所有的依賴項。

謝謝:)

+1

你得到的錯誤是什麼?它應該工作,如果文件是正確的 – Mark 2010-05-19 14:44:22

+0

也許你忘記在framework.h包括引號? – 2010-05-19 14:48:21

+0

沒有循環依賴的問題,但沒有定義的東西,就像它,如果我忘了包括一個.h。 Mosty的東西是在一些頭文件中內聯定義的。 – 2010-05-19 14:49:00

回答

7

基本上你在做什麼是在framework.h中的#include "A.h"和在A.h.中的#include "framework.h"。這將導致頭文件的循環依賴,並且您將得到錯誤,例如未定義的類A.要解決此問題,請僅在相應的cpp文件中使用頭文件中的前向聲明和#include。如果這是不可能的,那麼除了包含單獨的頭文件之外,我沒有看到任何其他選項。

0

我會建議使用#pragma once,並把,在你所有的頭文件(framework.h,A.H,B.h和C.h)的頂部。

雖然,如果你願意,我認爲你可以通過在framework.h中加入一個include guard來解決你的問題。

+0

請不要在框架中使用#pragma,我們普通的人會討厭g ++的那些棄用警告。 – avakar 2010-05-19 14:48:22

+2

不再是問題。 「然而,隨着3.4版GCC的發佈,#pragma一次處理代碼被修復爲在符號鏈接和硬鏈接上正常運行。該功能被」取消棄用「,並且警告消除了」 – 2010-05-19 14:51:50

+0

「我立即糾正了。 – avakar 2010-05-19 17:41:56

2

只是保護的主頭與包括警衛太:

#ifndef FRAMEWORK_H 
# define FRAMEWORK_H 
# include <A.h> 
# include <B.h> 
# include <C.h> 
#endif 

這將防止遞歸的包容性。

+0

沒有循環依賴的問題,但沒有定義的東西,就像它,如果我忘了包含.h。 Mosty的東西是在一些頭文件中內聯定義的。 – 2010-05-19 14:50:45

0

我猜你有一個依賴之間 - 說B和C,使得B依賴於C,但在framework.h C被列入後B.

+0

你是對的,但納文首先回答了 – 2010-05-19 14:57:10

0

通知包括一般都在C壞主意++。雖然有標題保護會阻止預處理器進入無限循環(或因此引發錯誤),但您會收到意外的編譯器錯誤,因爲在某些情況下,如果您認爲它是包含的,則不會包含頭文件。

你應該包括A.h,從framework.hB.hC.h,並在A.h,不包括framework.h,只是向前聲明你從它使用的類。或者以相反方式進行:包括來自A.h,B.hC.hframework.h,以及framework.h中的前向聲明類。當然,將每個需要更多詳細聲明的代碼放在.cpp文件中,例如class A

2

你不應該將主頭文件包含在子頭文件中。它應該用來使用戶的生活更輕鬆,而不是你的。

而是做以下操作:

1)請轉發所有你在相關的子頭文件需要的定義。

2)在CPP文件中只包含需要的子頭文件。

3)在應用程序代碼中使用框架時(例如),可以包含主框架頭文件。

+0

+1 – neuro 2010-05-19 16:03:17