在C程序和Vice-Versa中使用C ++代码

时间:2012-06-15 13:39:43

标签: c++ c gcc g++ dynamic-linking

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

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

在C ++文件中声明,名为import_helper.cpp。我定义了声明,并在上面显示,然后是实现,因此编译不会抱怨。在import.c,C程序中,我正在尝试调用该函数:记住,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.cpp编译g++。这可能是原因吗?我有其他类似方法的文件,所以我不太确定。任何想法? 感谢

4 个答案:

答案 0 :(得分:1)

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

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

因此,.c.cpp共享相同的数据。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

错误void getPassword(char *)也需要它。

答案 3 :(得分:0)

C ++可以抛出异常。

确保C ++代码中的“C”接口捕获所有内容,并返回错误状态,可能还有某种类似cstring的消息,因此不会出现任何意外的程序终止。