0

我正在做一个大项目,碰巧在两个地方有函数采用相同的参数并具有相同的名称,尽管它们做不同的事情。有人建议我使用外观方法并将所有内容都放在静态库中。然而它让程序变得非常奇怪。尽管包装器是单独的静态库并具有单独的名称空间,但函数并没有相互分离。总是来自 A.lib 的函数被 B::BF() 包装器调用。

可执行:

#include <iostream>    
#include "A/AWrapper.h"
#include "B/BWrapper.h"

int main()
{
    std::cout<<"A="<<A::AF(2)<<std::endl;
    std::cout<<"B="<<B::BF(2)<<std::endl;   //uses function int F(int x) from A lib

    getchar();
    return 0;
}

文件结构如下:

目录 A:

FA.h, FA.c  //function int F(int x) is defined - C language
AWrapper.h, AWrapper.cpp //a simple wrapper function AF of int F(int x); C++

目录 B:

FB.h, FB.c  //function int F(int x) is defined - C language
BWrapper.h, BWrapper.cpp //a simple wrapper function AF of int F(int x); C++

以上是调用它们的简单程序。详细文件列表:

图书馆 - - - - - - - :

发.h:

#ifndef A_H_INCLUDED
#define A_H_INCLUDED

int F(int x);

#endif // A_H_INCLUDED

FA.c:

#include "FA.h"

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

AWrapper.h:

#ifndef AWRAPPER_H_INCLUDED
#define AWRAPPER_H_INCLUDED

namespace A{
   int AF(int x);
}

#endif // AWRAPPER_H_INCLUDED

AWrapper.cpp

#include "AWrapper.h"

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

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

B库--------------:FB.h:

#ifndef B_H_INCLUDED
#define B_H_INCLUDED

int F(int x);

#endif // B_H_INCLUDED

FB.c:

#include "FB.h"

#define n 5

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

BWrapper.h:

#ifndef BWRAPPER_H_INCLUDED
#define BWRAPPER_H_INCLUDED

namespace B{

   int BF(int x);
}

#endif // BWRAPPER_H_INCLUDED

BWrapper.h:

#include "BWrapper.h"

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

namespace B{

   int BF(int x)
   {
      return F(x);
   }
}
4

1 回答 1

3

不,你不能那样解决它。如果你有一个不在命名空间或类中的“自由函数”[并且没有内联],它将具有相同的名称(在 C++ 中,如果它具有相同的参数/返回类型) - 所以无论你包装多少稍后再做,链接器仍将链接到它找到的函数的第一个版本。

有两个明显的解决方案:

  1. 重命名(其中一个)函数,使它们不再具有相同的名称。
  2. 将非常基本的函数包装到命名空间和/或类中,以便获得限定名称。

这些解决方案中的任何一个都涉及修改 FA.c 和/或 FB.c。

另一种方法是为每组函数使用一个共享库——这样 FA.c 和 FB.c 永远不会在同一个共享库中,并将 FA.o 静态链接到一个共享库,将 FB.o 链接到另一个共享库图书馆。但这意味着拥有共享库,我希望您在选择静态链接时首先选择不这样做。

如果代码在 C++中是可编译的(也就是说,它不使用new,或其他 C++ 关键字作为变量名,并且在将指针从一种类型传递到另一种类型时不会过于疯狂,而无需强制转换等),您还可以做这样的事情:deletethis

FA.cpp:

namespace A
{
    #include "FA.c"
}

FB.cpp:

namespace B
{
    #include "FB.c"
}
于 2013-07-23T14:00:27.837 回答