我一直在努力解决我正在从事的项目的问题。 假设我有几个文件:
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 中,调用了几个在 reflection.h 中声明并在
“record_sll.c”` 中实现的函数。
我有两个问题:
在那种情况下,C 和 C++ 之间的连接对我来说不起作用(我以前用其他文件试验过它,它以前似乎可以工作)。 尝试编译时,我收到如下错误:
io_recorder.cpp:在函数‘void io_recorder_fun_entry(char*, TypedObject*, int)’中:
io_recorder.cpp:61:79:错误:“void io_recorder_fun_entry(char*, TypedObject*, int)”与“C”链接的声明冲突 tern "C"void io_recorder_fun_entry(char * name, TypedObject args[], int len) {
在
io_recorder.cpp:4:0 包含的文件中: reflection.h:32:13: 注意:之前的声明带有“C++”链接 extern void io_recorder_fun_entry(char * name, TypedObject args[], int len);
显然我做错了什么,我不知道是什么。 我应该更改什么才能使其正确编译?
- 在以前的错误中,当我使用它们时,
io_record
似乎无法识别来自record_sll
的函数。 它与问题1的错误有什么关系吗?如果不是,我应该怎么做才能确保io_record
知道它们。
在此先感谢您的帮助,我希望我能尽快解决这个问题。
最佳答案
从 C++ 的角度来看,您的定义有冲突:
- 在您的 header 中,您将这两个函数都声明为普通的 c++ 函数(即没有特定的调用约定)
- 在正文中,您将函数定义为使用 C 调用约定
这是一个问题,因为在所有使用你的头文件的编译单元中,编译器将使用 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++ 的更多信息| .
关于c++ - 从 .c 文件调用 .cpp 文件中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43438094/