2014-12-30 26 views
1

在C++中編寫應用程序時遇到麻煩。我有兩個項目。項目A是普通的C++項目,項目B是具有clr支持的C++項目。項目A包含使用LLVM框架頭文件的類。項目B包含一些類項目A的託管包裝。我可以使用項目B中的項目A中的類而不包含它們的標題嗎?項目之間的C++頭文件

原因是這樣的。當我在項目B中包含來自項目A的類頭時,我還需要指定項目A使用此頭的框架庫,但LLVM框架無法與clr支持進行協作。我不能移動框架包括從頭到cpp文件。我該如何解決它?

+2

你必須使用標題 - 否則你的源文件如何知道如何使用每個類?我認爲解決這個問題的唯一方法就是使用預處理器。 –

+1

只要你不需要同時使用LLVM和clr,你可以使用前向聲明。頭文件只聲明另一個源文件中存在的變量和函數,並將它們放入包含頭文件的類中,以便代碼知道這些函數和變量的存在。除非頭文件很大,你不想轉發聲明所有內容,或者創建另一個不包含不兼容頭文件的頭文件。 – tom

回答

0

只要您不使用依賴於LLVM標題的項目A中的模板,您可以隨時轉發聲明您在項目A標題中使用的類型,並將實際標題包含在cpp文件中。

假設您想要使用的類型是llvm_type,它是由LLVM編譯器的庫定義的類。在projectA.h,你可以這樣做:

class llvm_type; 

class MyAPrjClass { 
public: 
    void myMethod (llvm_type x, int y); 
} 

然後在你的projectA.cpp您包括LLVM頭:

#include <llvm_type.h> 

void MyAPrjClass:: myMethod (llvm_type x, int y) 
{ 
    // Define your method using the llvm_type here. 
} 

同理也可應用於結構,容器和其他類型的情況,只要你向前declarate他們。假設你想使用作爲LLVM編譯器一部分的std::vector<int>。在這種情況下,你在你的頭像class VectorInt;定義原型,並在你的CPP聲明你寫:

#include <vector> 
typedef std::vector<int> VectorInt; 

,並在你的方法定義使用它。

你不能做的是定義依賴於LLVM頭的模板類或方法,因爲你需要在相同的頭文件中定義方法,並且需要知道導入類型的實現。

+1

嗯,我甚至在問問題之前就試過了。儘管如此,我又試了一次,但現在讓我走上了正軌。看來LLVM對於包含非常嚴格。我的一些包含必須在頭文件(所有頭不是LLVM,而不是自定義類),其中一些必須在cpp文件(所有LLVM頭和所有自定義類),我不能使用windows.h 。出於某種原因,它與一個(是的只有一個)核心LLVM文件相沖突。謝謝你的建議,你真的幫我解決了這個問題。 – benderto

+0

不客氣。祝你好運。 –