2013-07-22 42 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