添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

有时需要将 C 和 C++ 代码混合在一起。例如,在使用遗留 C 代码或使用特定 C 库时,可为您的 C++ 代码提供某些特定功能。因此,在 C++ 文件中使用 C 代码时需要注意一些特殊步骤,反之亦然。

本文通过一些示例讨论了混合 C/C++ 代码所需的步骤。

1.从C++调用C函数

在本节中,我们将讨论如何从 C++ 代码调用 C 函数。

这是C代码(Cfile.c):

#include <stdio.h>
void f(void)
    printf("\n This is a C code\n");

第一步是创建此 C 代码的库。以下步骤创建一个共享库:

$ gcc -c -Wall -Werror -fPIC Cfile.c
$ gcc -shared -o libCfile.so Cfile.o

共享库 libCfile.so 是上述两个命令的结果。

这是主要的 C++ 代码 (main.cpp):

#include <iostream>
extern "C" {
void f();
void func(void)
    std::cout<<"\n being used within C++ code\n";
int main(void)
    func();
    return 0;

C 函数 f() 在符号 extern “C” 中声明,以告诉 cpp 编译器它具有 C 类型链接。

现在,编译代码编译代码(确保共享库 libCfile.so 链接到代码):

$ g++ -L/home/himanshu/practice/ -Wall main.cpp -o main -lCfile

在运行可执行文件之前,请确保共享库的路径包含在环境变量 LD_LIBRARY_PATH 中。

$ export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH

现在运行可执行文件'main':现在运行可执行文件'main':

$ ./main
 This is a C code
 being used within C++ code

所以我们看到从 C++ 代码中成功调用了一个 C 函数。

此外,请阅读之前发的博客获取有关如何在 Linux 中创建共享库的详细信息。

2.从C调用C++函数

在本节中,我们将讨论如何从 C 代码调用 C++ 函数。

这是一个 C++ 代码(CPPfile.cpp):

#include <iostream>
void func(void)
    std::cout<<"\n This is a C++ code\n";

我们将看到如何从 C 代码中调用函数 func()。

第一步是通过引入符号 extern “C” 来更改此函数的声明/定义。

第一步是通过引入符号 extern “C” 来更改此函数的声明/定义。

#include <iostream>
extern "C" void func(void)
    std::cout<<"\n This is a C++ code\n";

下一步是根据上面的代码创建一个库。以下步骤创建共享库:

g++ -c -Wall -Werror -fPIC CPPfile.cpp
$ g++ -shared -o libCPPfile.so CPPfile.o

上述命令应生成 libCPPfile.so 共享库。上述命令应生成 libCPPfile.so 共享库。

以下是 C 语言 (main.c) 的主要代码:

#include <stdio.h>
extern void func(void);
void f(void)
    printf("\n being used within C code\n");
int main(void)
    func();
    return 0;

请注意,C++ 函数在这里被声明为 extern。

像这样编译 C 代码 (main.c):

gcc -L/home/himanshu/practice/ -Wall main.c -o main -lCPPfile

并将当前目录路径添加到环境变量 LD_LIBRARY _PATH

export LD_LIBRARY_PATH=/home/himanshu/practice:$LD_LIBRARY_PATH

现在运行可执行文件'main':

$ ./main
 This is a C++ code
 being used within C code

上面的输出表明从 C 代码中成功调用了 C++ 函数。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: [email protected]