C 库的 C++ 包装器

Max*_*ien 5 c c++ global-variables static-variables wrapper

最近我发现了一个我想在我的 C++ 项目中使用的 C 库。该代码配置了全局变量,并将其输出写入静态指针指向的内存。当我执行我的项目时,我希望运行 2 个 C 程序实例:一个具有配置 A,一个具有配置 B。我不能运行我的程序两次,所以我认为有 2 个选项:

  • 创建一个C++ 包装器:这里的问题是包装器类应该包含 C 库拥有的所有全局/静态变量。由于 C 库中的函数使用这些变量,我必须为这些函数创建非常大的参数列表。
  • 复制粘贴C 库:在这里,我必须调整 C 库中每个函数和每个变量的名称。

哪一种是最快的解决方案?是否有其他可能性来运行同一 C 源代码的 2 个实例?

谢谢,

最大限度

pet*_*hen 3

C++ -Wrapper
通过将“整个库”(仅稍作修改)粘贴到类中,您可以更轻松地完成任务。

// C
static char resultBuffer[42];
void ToResult(int x) { ... }
char const * GetResult() { return resultBuffer; }
Run Code Online (Sandbox Code Playgroud)

变成

// C++
class CMyImportantCLib
{
  private:
    char resultBuffer[42];
    void ToResult(int x) { ... } // likely, no code changes at all
    char const * GetResult() { return resultBuffer; }
} ;
Run Code Online (Sandbox Code Playgroud)

主要有声明性更改(例如“杀死”静态和外部声明)。不过,您需要在方法内寻找静态变量,并将它们也转换为成员

单独的命名空间
这是一个丑陋的解决方案,但对你来说可能就足够了:

// impMyLib.h
namespace A 
{
  #include "c-lib.h"
}
namespace B
{
  #include "c-lib.h"
}

// impMyLib.cpp
namespace A 
{
  #include "c-lib.c"
}
namespace B
{
  #include "c-lib.c"
}
Run Code Online (Sandbox Code Playgroud)

如果幸运的话,优化器/链接器会成功折叠相同的代码。然而,类型 inA::B::是不相关的。