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

标签 c++ include mixing

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

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/

相关文章:

c++ - 获取字符串标记/参数作为解析

c++ - 提取cpp中的所有包含文件

ios - 如何传递数据类型为 CMTime 的浮点值?

c# - 如何将 C# 转换为 C++

c++ - 什么是复制省略和返回值优化?

c++ - 如何在没有源代码的情况下检查 GDB 中的 std::string?

qt - 包含来自单独目录的文件时的 undefined reference

visual-studio-2010 - 用VS2008建的dll可以用用VS2010建的dll吗

c++ - 返回值存储在哪里?

C++ 包含的类不被另一个类识别