如何在 C++ 中调用 C 函数,在 C 中调用 C++ 函数

举报
Tiamo_T 发表于 2022/07/15 19:27:42 2022/07/15
【摘要】 本文通过一些示例讨论了混合 C/C++ 代码所需的步骤。

有时需要将 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)
{
    f();
    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();
    f();
    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++ 函数。

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

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。