从 .c 文件调用 .cpp 文件中的函数

Calling a function in a .cpp file from a .c file

我一直在努力解决我正在从事的项目的问题。 假设我有几个文件:

reflection.h 
sll_insert.c
record_sll.c
io_recorder.cpp

上述所有 cpp 和 c 文件都使用:

#include "reflection.h"

"reflection.h" 中的声明如下:

extern void io_recorder_fun_entry(char * name, TypedObject args[], int len);

extern void io_recorder_fun_exit(char * name, TypedObject args[], int len);

这两个函数是在 "io_recorder.cpp" 中实现的,它们使用了另一个来自 "io_recorder.cpp" 的函数 io_record

现在,在"io_recorder.cpp"中,两个函数如下:

extern "C" void io_recorder_fun_entry(char * name, TypedObject args[], int len) {
    cout << "Entering function "<< name << endl; 
    io_record(args, len);
}

extern "C" void io_recorder_fun_exit(char * name, TypedObject args[], int len) {
    cout << "Exiting function "<< name << endl; 
    io_record(args, len);

}

io_record, there are calls being made to several functions declared in reflection.h and implemented in"record_sll.c"`.

我有两个问题:

  1. 在那种情况下,C 和 C++ 之间的连接对我不起作用(我以前用其他文件试验过它,之前似乎可以工作)。 尝试编译时,我收到如下错误:

    io_recorder.cpp: In function ‘void io_recorder_fun_entry(char*, TypedObject*, int)’:

    io_recorder.cpp:61:79: error: conflicting declaration of ‘void io_recorder_fun_entry(char*, TypedObject*, int)’ with ‘C’ linkage tern "C" void io_recorder_fun_entry(char * name, TypedObject args[], int len) {

    包含在 io_recorder.cpp:4:0: reflection.h:32:13: note: previous declaration with ‘C++’ linkage extern void io_recorder_fun_entry(char * name, TypedObject args[], int len);

  2. 的文件中

显然我做错了什么,我不知道是什么。 我应该更改什么才能正确编译?

  1. 在之前的错误中,当我使用它们时,io_record 似乎无法识别来自 record_sll 的功能。 它与问题1的错误有什么关系吗?如果不是,我应该怎么做才能确保 io_record 认识他们。

在此先感谢您的帮助,希望我能尽快解决这个问题。

从 C++ 的角度来看,你的定义有冲突:

  • 在您的 header 中,您将这两个函数都声明为普通的 c++ 函数(即没有特定的调用约定)
  • 在 body 中,您将函数定义为使用 C 调用约定

这是一个问题,因为在使用你的header的所有编译单元中,编译器将使用c++调用序列生成代码,而不知道你的函数体使用另一个调用序列。因此出现错误消息。

要解决此问题,您必须将两种情况下的函数声明为 extern "C"

但是,从 C 的角度来看extern "C" 语法无法识别。因此,如果您想对 C++ 和 C 使用相同的 header,则需要一些带有条件编译的额外 gym:

#ifdef __cplusplus
extern "C" {  // this line will be compiled only if included in a .cpp file and not in a .c
#endif
    // your c function declaration go here without the extern "C"
#ifdef __cplusplus
}
#endif

您将在 this FAQ page 上找到有关 混合 C 和 C++ 的更多信息。