2013-07-22 35 views
0

我有一個包含C和C++語言的(大型)C/C++項目。事實證明,有兩個名稱相同的C函數。這些函數在不同位置的兩個不同的* .c文件中定義。通常在最高級別上,該項目是C++。這個問題被質疑和回答here如何安全地設置C/C++項目(文件組織)

但仍然有一個問題「如何安全地組織這些文件」仍然存在。我如何分組這樣的項目,以便不存在名稱衝突,並且我可以確定正確的函數被調用。爲每個函數編寫包裝會有幫助嗎?

那它是如何看的那一刻:的函數F AC //的函數F

了Bh //的函數F第二個聲明中第一個定義 啊//首先聲明 BC //函數的第二個定義˚F

試圖讓這樣的事:課程名稱衝突的

extern "C"{ 
#include "A.h" 
#include "B.h" 
} 

原因。我能做些什麼來避免這個問題,並擁有可靠的代碼?會出現這樣的解決方案幫助:

A_Wrapper.h:// C++

extern "C"{ 
#include "A.h" 
} 

void WrapF_A(int x) 
{ 
    F(x); 
} 

B_Wrapper.h:// C++

extern "C"{ 
#include "B.h" 
} 

void WrapF_B(int x) 
{ 
    F(x); 
} 

,然後在該程序:

#include A_Wrapper.h 
#include B_Wrapper.h 

在這個項目中對每個文件進行緩衝將是相當不可能的,因爲它涉及數百個文件,而且我可能會損壞一些代碼。有沒有辦法讓程序的某些部分只能看到包含文件?

編輯: 因此,我創建了一個簡單的項目來說明問題,並嘗試應用doctorlove給出的提示。但是仍然會出現F錯誤的多重定義。我應該改變什麼?項目文件:

A.H:

#ifndef A_H_INCLUDED 
#define A_H_INCLUDED 

int F(int x); 

#endif // A_H_INCLUDED 

變交流

#include "A.h" 

int F(int x) 
{ 
    return x*x; 
} 

AWrapper.h:

#ifndef AWRAPPER_H_INCLUDED 
#define AWRAPPER_H_INCLUDED 

int AF(int x); 

#endif // AWRAPPER_H_INCLUDED 

AW.cpp:

#include "AWrapper.h" 
extern "C"{ 
#include "A.h" 
} 

int AF(int x) 
{ 
    return F(x); 
} 

B.h:

#ifndef B_H_INCLUDED 
#define B_H_INCLUDED 

int F(int x); 

#endif // B_H_INCLUDED 

B.c:

#include "B.h" 

int F(int x) 
{ 
    return -x*x; 
} 

BWrapper.h:

#ifndef BWRAPPER_H_INCLUDED 
#define BWRAPPER_H_INCLUDED 

int BF(int x); 

#endif // BWRAPPER_H_INCLUDED 

BW。CPP:

#include "BWrapper.h" 
extern "C"{ 
#include "B.h" 
} 

int BF(int x) 
{ 
    return F(x); 
} 
+0

我們現在可能正在解決錯誤的問題。爲什麼你將兩個頭文件包含在同一個源文件中?你不能只包括你需要的東西嗎? – doctorlove

+0

我正在使用Umfpack和SuperLU庫。在一個程序中,我需要兩個解算器來執行不同的計算。而且這兩個庫的功能都很少,命名方式完全一樣。 – Misery

回答

1

去與你的包裝的想法,但是寫一個facade(見here)暴露你需要什麼,你的B 都在那裏哪些功能需要。

最後你會喜歡的東西

//header Wrap_A.h 
#ifndef WRAP_A_INCLUDED 
#define WRAP_A_INCLUDED 

//for some input Data left as an exercise for the reader... 
double solve_with_A(Data data); 

#endif 


//header Wrap_B.h 
#ifndef WRAP_B_INCLUDED 
#define WRAP_B_INCLUDED 

//for some input Data... 
double solve_with_B(Data data); 

#endif 

然後做兩個cpp文件,包括所有衝突的頭文件,那些從A在A.cpp和(二)使用在B.cpp中,所以衝突不會發生。然後solve_with_Asolve_with_B函數將調用所有他們需要的東西,而不會將它們泄漏到整個程序中並導致衝突。

你可能不得不想一想Data實際上會是什麼。您可以定義自己的類型,一個用於A,另一個用於B。請避免在包裝/外觀標頭中公開實施細節。
如果標題讓你感到痛苦,在頑皮的角落將它們關閉。


編輯

鑑於你有兩個功能,F,如果你把所有的源到一個項目中的鏈接器應和會抱怨它可以同時看到。相反,您需要創建兩個靜態庫,並將包裝版本公開給主項目。

+0

我已經創建了一個描述問題的小型項目,但仍然出現錯誤,說有多個定義。 – Misery

+0

我編輯過的問題。我添加了一個簡單的問題插圖,並將其解決方案應用於它(據我瞭解)。然而問題仍然存在。 – Misery

+0

@Misery當然 - 抱歉。請參閱編輯。 – doctorlove