从 .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"`.
我有两个问题:
在那种情况下,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);
的文件中
显然我做错了什么,我不知道是什么。
我应该更改什么才能正确编译?
- 在之前的错误中,当我使用它们时,
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++ 的更多信息。
我一直在努力解决我正在从事的项目的问题。 假设我有几个文件:
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"`.
我有两个问题:
在那种情况下,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);
的文件中
显然我做错了什么,我不知道是什么。 我应该更改什么才能正确编译?
- 在之前的错误中,当我使用它们时,
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++ 的更多信息。