广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中怎么调用C接口
  • 890
分享到

C++中怎么调用C接口

2023-06-16 08:06:26 890人浏览 安东尼
摘要

本篇文章为大家展示了c++中怎么调用C接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++如何调用C接口首先提供一个C接口:#include"test.h" voi

本篇文章为大家展示了c++中怎么调用C接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

C++如何调用C接口

首先提供一个C接口:

#include"test.h" void testCfun() {     printf("I am c fun\n");     return; }

为了简化,我们在这里就不将它做成静态库或者动态库了,有兴趣的可以参考《静态库制作》自行尝试。我们在这里编译成C目标文件:

GCc -c test.c

另外提供一个头文件test.h:

#include<stdio.h> void testCfun();

我们的C++代码调用如下:

#include"test.h" #include<iOStream> using namespace std; int main(void) {          cout<<"start to call c function"<<endl;     testCfun();     cout<<"end to call c function"<<endl;     return 0; }

编译:

$ g++ -o main main.cpp test.o /tmp/ccmwVJqM.o: In function `main': main.cpp:(.text+0x21): undefined reference to `testCfun()' collect2: error: ld returned 1 exit status

很不幸,最后的链接报错了,说找不到testCfun,但是我们确实定义了这个函数。为什么会找不到呢?现在你还会认为C++直接就可以调用C接口了吗?

真相

我们都知道,C++中函数支持重载,而C并不支持。C++为了支持函数重载,它在“生成”函数符号信息时,不能仅仅通过函数名,因为重载函数的函数名都是一样的,所以它还要根据入参,命名空间等信息来确定唯一的函数签名。或者说C++生成函数签名的方式与C不一致,所以即便是函数名一样,对于C和C++来说,它们最终的函数签名还是不一样。当然这里又是另外一回事了,我们不细说。我们看看两个文件里的函数符号有什么区别:

$ nm test.o|grep testCfun 0000000000000000 T testCfun $ nm main.o|grep testCfun                 U _Z8testCfunv

所以它们两个能链接在一起才真是奇怪了呢!名字都不同,还怎么链接?

如何处理

那么如何处理呢?很显然,我们必须告诉链接器,这是一个C接口,而不是C++接口,所以需要加入 extern C,我们修改test.h

#include<stdio.h> extern "C"{ void testCfun(); }

这里用extern "C"将testCfun接口包裹起来,告诉编译器,这里的是C代码哈,你要按C代码的方式处理。再次编译:

$ g++ -o main main.cpp test.o $ ./main start to call c function I am c fun end to call c function

看终端输出,完美!

优化

虽然上面的C接口可以被C++正常调用了,但是如果这个C接口要被C代码调用呢?增加main.c内容如下

//main.c #include"test.h" int main(void) {          testCfun();     return 0; }

编译:

$ gcc -o main main.c test.c In file included from main.c:2:0: test.h:2:8: error: expected identifier or '(' before string constant  extern "C"{         ^ In file included from test.c:2:0: test.h:2:8: error: expected identifier or '(' before string constant  extern "C"{

不出意外,又报错了,很显然,C语言中并没有extern  "C"这样的写法,所以为了能使得test.c的代码既能被C++调用,也能被C调用,需要改写成下面这样:

#include<stdio.h> #ifdef __cplusplus extern "C"{ #endif  void testCfun();  #ifdef __cplusplus } #endif

这里通过__cplusplus宏来控制是否需要extern “C”,如果是C++编译器,那么extern  "C"部分就会被预处理进去,这样test.c代码就可以既用于C++,也可以用于C啦。

赶快去你的C项目代码头文件中看看,是不是也有这样的代码段呢?

问题

为什么我们在C++代码中可以直接调用一些标准C库函数呢?即使你在main函数中调用printf等函数,它也不会出现链接错误。因为库函数已经有了类似的处理了。

如果你还是不确定,你可以先预处理:

$ g++ -E main.i main.cpp

去生成的main.i文件中找一找,是不是有extern "C"。

上述内容就是C++中怎么调用C接口,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++中怎么调用C接口

本文链接: https://www.lsjlt.com/news/282853.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中怎么调用C接口
    本篇文章为大家展示了C++中怎么调用C接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++如何调用C接口首先提供一个C接口:#include"test.h" voi...
    99+
    2023-06-16
  • c#怎么调用webservice接口
    要调用Web服务接口,首先需要添加对Web服务的引用。 在Visual Studio中,右键单击项目,选择“添加”>“引用”。 在...
    99+
    2023-10-30
    C# webservice
  • 怎么使用javascript调用c接口
    今天小编给大家分享一下怎么使用javascript调用c接口的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。创建C接口首先,我...
    99+
    2023-07-06
  • C++中怎么调用C链接库
    本篇文章给大家分享的是有关C++中怎么调用C链接库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++调用C链接库,其实相对C调用C++。因为C++本来就向下兼容C吧但由于编译...
    99+
    2023-06-17
  • C#怎么调用C++动态库接口函数和回调函数
    本文小编为大家详细介绍“C#怎么调用C++动态库接口函数和回调函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么调用C++动态库接口函数和回调函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 前言...
    99+
    2023-06-29
  • C#接口怎么用
    小编给大家分享一下C#接口怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!C#接口实例应用问题的提出,假设我们公司有两种程序员:VB程序员,指的是用VB写程序的程序员,用clsVBProgramer这个类表示;Delp...
    99+
    2023-06-17
  • C#中interface接口怎么用
    小编给大家分享一下C#中interface接口怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对C# interface接口接触没多长时间,对此起初感觉很简单...
    99+
    2023-06-17
  • C++中怎么使用接口
    C++中怎么使用接口,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先我们需要一些宏://  // Interfaces.h &nb...
    99+
    2023-06-17
  • C++如何调用已经写好的C接口
    目录1、C++调用C文件2、原因分析3、解决调用失败问题4、思考:那C语言能够调用C接口吗5、C接口既能被C++调用又能被C调用前言: 如何在C++代码中调用写好的C接口?...
    99+
    2022-11-12
  • C#中怎么定义接口
    C#中怎么定义接口,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#接口定义之声明接口声明接口在语法上和声明抽象类完全相同,例如这里有一个银行账户的接口:public&nb...
    99+
    2023-06-17
  • c#短信接口怎么用
    这篇文章给大家分享的是有关c#短信接口怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。短信发送接口1.1 请求地址请求地址是客户接口程序调用时请求的url地址,采用的是https post 接口,地...
    99+
    2023-06-04
  • C#如何实现接口base调用
    今天小编给大家分享一下C#如何实现接口base调用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。背景在三年前发布的C#8.0...
    99+
    2023-07-02
  • C#中接口有什么用
    这期内容当中小编将会给大家带来有关C#中接口有什么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#接口的作用解释实例:public interface IBark &nb...
    99+
    2023-06-17
  • C#接口怎么定义
    这篇文章主要介绍“C#接口怎么定义”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#接口怎么定义”文章能帮助大家解决问题。C# 接口(Interface)接口定义了所有类继承接口时应遵循的...
    99+
    2023-06-17
  • 怎么使用C#的API接口
    这篇文章主要介绍“怎么使用C#的API接口  ”,在日常操作中,相信很多人在怎么使用C#的API接口  问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用C#的API接口  ...
    99+
    2023-06-03
  • C#的INotifyPropertyChanged接口怎么使用
    这篇文章主要介绍“C#的INotifyPropertyChanged接口怎么使用”,在日常操作中,相信很多人在C#的INotifyPropertyChanged接口怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-29
  • C++ Boost MPI接口怎么应用
    这篇“C++ Boost MPI接口怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++&nbs...
    99+
    2023-07-04
  • C#调用C++动态库接口函数和回调函数方法
    目录1. 前言2. 普通接口函数调用示例2.1 C++端编写接口2.2 C#端调用3. 回调函数调用示例3.1 C++端编写接口3.2 C#端调用1. 前言 需求: 当前C已经写好了...
    99+
    2022-11-13
  • C#调用接口的方式有哪些
    这篇“C#调用接口的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#调用接口的方式有哪些”文章吧。在用C#调用接...
    99+
    2023-07-02
  • C++/CLI怎么调用C#
    这篇文章主要讲解了“C++/CLI怎么调用C#”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++/CLI怎么调用C#”吧!跨越语言的障碍:C++/CLI 调用 C#当C#项目需要引用C++...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作