0

我有一个(大型)C/C++ 项目,它由 C 和 C++ 语言组成。在某些时候,事实证明有两个具有相同名称的 C 函数。这些函数在不同位置的两个不同 *.c 文件中定义。一般来说,最高级别的项目是 C++。这个问题在这里被质疑和回答

然而,仍然存在“如何安全地组织这些文件”的问题。我怎样才能对这样的项目进行分组以便没有名称冲突,并且我可以确定调用了正确的函数。为每个函数编写一个包装器会有帮助吗?

现在的样子: Ah //函数 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

修改该项目中的每个文件是相当不可能的,因为它包含数百个文件,而且我可能会损坏一些代码。有没有办法让包含文件只在程序的某些部分可见?

编辑:所以我创建了一个简单的项目来说明这个问题,并尝试应用医生爱给出的提示。但是仍然会出现 F 错误的多重定义。我应该改变什么?项目文件:

啊:

#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);
}

乙:

#ifndef B_H_INCLUDED
#define B_H_INCLUDED

int F(int x);

#endif // B_H_INCLUDED

公元前:

#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);
}
4

1 回答 1

1

遵循你的包装想法,但编写一个外观(另请参见此处),它公开你需要从 A 得到的东西,以及你需要从 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.cpp中来自A的头文件和B.cpp中来自B的头文件,这样就不会发生冲突。然后solve_with_A,andsolve_with_B函数将调用它们需要的所有东西,而不会将它们泄漏到整个程序并引起冲突。

您可能需要考虑一下Data实际情况。您可以定义自己的类型,一种 forA和一种 for B。只需避免在包装/外观标头中公开实现细节。
如果标题让您感到痛苦,请将它们放在顽皮的角落里。


编辑

鉴于您有两个功能,F如果您将所有源代码放入一个项目中,则链接器应该并且会抱怨它可以同时看到两者。相反,您需要创建两个静态库,并将包装的版本公开给您的主项目。

于 2013-07-22T16:30:35.757 回答