我目前正在编写一个非常低级别的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++
。这可能是原因吗?我有其他类似方法的文件,所以我不太确定。任何想法?
感谢
答案 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的消息,因此不会出现任何意外的程序终止。