gpt4 book ai didi

c++ - 如何从 C++ 处理 C 库中不同大小的类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:28 25 4
gpt4 key购买 nike

我有一个从 C++ 链接到的外部 C 库。该库定义了一个使用 bool 的结构,并为 C 语言包含了一个 typedef。问题是这个 typedef 使用 int,所以(在我的平台上)不是这个大小为 1 字节的 bool,而是 4 个字节。

然后,当我#include header 并在 C++ 中创建结构时,bool(作为 C++ 标准类型)的大小为 1 个字节,因此该结构具有完全不同的内存布局,当我将它传递给 C 库以便在那里修改它时,会导致各种堆栈损坏。

有没有办法在不修改外部库的情况下解决这个问题?我想用 C++ 编译器而不是 C 编译器编译外部库会起作用,对吗?这是我解决这个问题的唯一机会吗?

库.h:

#ifndef __cplusplus
typedef int bool;
#endif

typedef struct {
int numValues;
bool values[20];
} bArray;

int arraySize();

lib.c:

#include "lib.h"

int arraySize() {
return sizeof(bArray);
}

主要.cpp:

#include <iostream>

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

int main() {
std::cout << "size in c++: " << sizeof(bArray) << std::endl
<< "size in c : " << arraySize() << std::endl;
return 0;
}

输出:

size in c++: 24
size in c : 84

最佳答案

您可以编写自己的头文件并使用它来代替库提供的损坏的头文件:

固定库.h

typedef struct {
int numValues;
int values[20];
} bArray;

int arraySize();

当然,这意味着您需要维护它以防库更新。但是,如果库得到积极维护,那么可能更好的方法是发送拉取请求以在上游解决问题。

此外,如果 C 库中有其他依赖于 lib.h 的头文件,那么 lib.h 应该真的有一个头文件保护,它也必须在您的替换中使用,并且您必须注意包含先更换。

如果没有 header 保护,那么如果这些 header 也依赖于 lib.h,那么您将不得不复制所有您依赖的此类 header 。

I guess compiling the external library with a C++ compiler instead of a C compiler would work, correct?

只有当该库恰好是用 C 的一个子集编写的,该子集也是有效的 C++ 时,它才有可能工作。此外,此 C++ 编译版本不会与库的 C 版本二进制兼容,因此您不能有其他依赖项本身依赖于此(最初)C 库。


如果修改 C 库没问题,另一种方法是修复库头本身以使用实际的 bool 数据类型:

库文件

#ifndef __cplusplus
#include <stdbool.h>
#endif

typedef struct {
int numValues;
bool values[20];
} bArray;

int arraySize();

当然,这将需要您重新编译库,并且它将不再与使用 int 的原始版本二进制兼容。此外,这会使库需要 C99 标准,并且不能再在 C89 中工作。

关于c++ - 如何从 C++ 处理 C 库中不同大小的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52011451/

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