gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:25:58 25 4
gpt4 key购买 nike

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

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”` 中实现的函数。

我有两个问题:

  1. 在那种情况下,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);

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

  1. 在以前的错误中,当我使用它们时,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com