0

我目前正在编写一个非常低级的 C 程序与高级 C++ 程序之间的接口。它们的关联方式是通过链表:C 程序有一个链表,接口获取存储在链表中每个节点中的信息并将其转换为 C++ 向量。该过程本身不是程序。问题是如何从 C 程序中调用该 C++ 函数。让我给你一些启示:

int importData(List *head, char * source, char * dest);

在 C++ 文件中声明,称为import_helper.cpp. 我定义了声明,如上所示,然后是实现,所以编译不会抱怨。在import.cC 程序中,我试图调用该函数:记住,List 是import.c 现在定义的结构,在import.c我有:

#if defined(_cplusplus)
extern 'C' {
#endif
typedef struct list{
   struct list *next
   .. other additional data goes here ...
}List;

int importData(List *head, char *source, char *dest);
#if defined(_cplusplus)
}
#endif

import_helper.cpp标题中我做了一个#include "import.c". import.c没有 .h 文件(有人编写了该代码,我个人认为这本身就是一个错误)。

当我编译时,我得到:

error: expected unqualified-id before 'class'
error: conflicts with the new declaration with 'C' linking
error: previous declaration of 'void getPassword(char *)' with 'C++' linkage 

那只是一个样本。但是,我相信import.c是用编译的gcc,我的Build文件是import_help.cppg++. 这可能是原因吗?我有其他类似方法的文件,所以我不太确定。任何想法?谢谢

4

4 回答 4

1

解决方案是创建一个import_helper.h文件,然后import_helper.cpp我将它包含#include "import_helper.h"在 ( )import_helper.cppimport.c. 在import_helper.h我有:

extern "C"{
   typedef struct list{
      ... /*some code goes here */
      struct list* next;
   }List;
   int importData(List *, char*, char*);
}

所以 the.c和 the.cpp共享相同的数据。

于 2012-06-15T15:42:11.527 回答
0

您可以通过在后端编写使用 C++ 的 DLL 在两个项目之间共享公共代码。只要为 C 进行声明,您就应该能够从 C 或 C++ 程序调用定义的方法。

于 2012-06-15T14:05:55.977 回答
0

当您在 .cpp 文件中定义 importData 时,您还需要将其放在 extern "C" (注意双引号)块中:

extern "C"{
    int importData(List *head, char *source, char *dest){
        blah blah blah
        ...
    }
}

并且从错误void getPassword(char *)中也需要它。

于 2012-06-15T14:25:23.000 回答
0

C++ 可以抛出异常。

确保 C++ 代码中的“C”接口捕获所有内容,并返回错误状态,并且可能返回某种 cstring 之类的消息,这样您就不会遇到任何意外的程序终止。

于 2012-06-15T15:45:20.053 回答