在C++中为C库强制转换数据类型

Casting a datatype for a C library in C++

本文关键字:转换 数据类型 C++ 中为      更新时间:2023-10-16

我正在尝试使用C++中的C库,该库具有以下功能:

int MAG_robustReadMagModels(char *, MAGtype_MagneticModel *(*)[], int);

根据给出的示例C代码,以下是如何调用此库:

char filename[] = "filename";
int epochs = 1;
MAGtype_MagneticModel * MagneticModels[1];
if(!MAG_robustReadMagModels(filename, &MagneticModels, epochs)) {
    //ERROR
}

我试图将其翻译成c++,如下所示:

char filename[8] = "filename";
int epochs = 1;
MAGtype_MagneticModel * MagneticModels[1];
if(!MAG_robustReadMagModels(filename, &MagneticModels, epochs)) {
    //ERROR
}

这给了我以下错误:

error: C2664: 'int MAG_robustReadMagModels(char *,MAGtype_MagneticModel *(*)[],int)' 
: cannot convert argument 2 from 'MAGtype_MagneticModel *(*)[1]' to 'MAGtype_MagneticModel *(*)[]'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

我该如何让c++为它调用的c库正确地重新解释这一点?为了参考,我尝试合作的图书馆可以在http://www.ngdc.noaa.gov/geomag/WMM/soft.shtml在标记为WMM2015_Windows.zip 的链接下

此错误是因为编译器对已知大小(type[x])的数组的处理与对未知大小(type[])的数组不同。避免这个问题的一种方法是创建一个未知(就编译器而言)大小的数组,以传递到函数中:

char filename[] = "filename";
int epochs = 1;
void *foo = malloc(sizeof(MAGtype_MagneticModel *));
if (foo) {
    MAGtype_MagneticModel* *magnetic_models = (MAGtype_MagneticModel **)foo;
    if(!MAG_robustReadMagModels(filename, (MAGtype_MagneticModel* (*)[]) &magnetic_models, epochs)) {
        //ERROR
    } else {
        // do something with the new magnetic_model;
    }
    free(foo);
}