gpt4 book ai didi

C 库的 C++ 包装器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:46 24 4
gpt4 key购买 nike

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

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

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

谢谢,

最大

最佳答案

C++ -包装器
通过将“整个库”(仅稍作修改)粘贴到一个类中,您可以更轻松地摆脱困境。

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

成为

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

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

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

// 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"
}

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

关于C 库的 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2690601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com