C++调用C代码

一个C语言文件p.c

#include <stdio.h>
void print(int a,int b)
{
printf("这里调用的是C语言的函数:%d,%d\n",a,b);
}

一个头文件p.h

#ifndef _P_H
#define _P_H void print(int a,int b); #endif

C++文件调用C函数

#include <iostream>
using namespace std;
#include "p.h"
int main()
{
cout<<"现在调用C语言函数\n";
print(3,4);
return 0;
}

执行命令

gcc -c p.c
g++ -o main main.cpp p.o

编译后链接出错:main.cpp对print(int, int)未定义的引用。

  • 编译后链接出错:main.cpp对print(int, int)未定义的引用。

  • 原因分析

    • p.c我们使用的是C语言的编译器gcc进行编译的,其中的函数print

      编译之后,在符号表中的名字为 _print
    • 我们链接的时候采用的是g++进行链接,也就是C++链接方式,程序在运行到调用

      print函数的代码时,会在符号表中寻找_print_int_int(是按照C

      ++的链接方法来寻找的,所以是找_print_int_int而不是找_print

      )的名字,发现找不到,所以会t提示“未定义的引用”
    • 此时如果我们在对print的声明中加入 extern “C” ,这个时候,g

      ++编译器就会按照C语言的链接方式进行寻找,也就是在符号表中寻找_print

      ,这个时候是可以找到的,是不会报错的。
  • 总结

    • 编译后底层解析的符号不同,C语言是_print,C++是_print_int_int

解决调用失败问题

修改p.h文件

#ifndef _P_H
#define _P_H
extern "C"{
void print(int a,int b);
}
#endif

修改后再次执行命令

gcc -c p.c
g++ -o main main.cpp p.o
./main

运行无报错

思考:那C代码能够被C程序调用吗

实验:定义main,c函数如下

#include <stdio.h>
#include "p.h"
int main()
{
printf("现在调用C语言函数\n");
print(3,4);
return 0;
}

重新执行命令如下

gcc -c p.c
gcc -o mian main.c p.o

报错:C语言里面没有extern “C“这种写法

C代码既能被C++调用又能被C调用

为了使得p.c代码既能被C++调用又能被C调用

将p.h修改如下

#ifndef _P_H
#define _P_H #ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */ void print(int a,int b); #ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */ #endif /* __P_H */

再次执行命令

gcc -c p.c
gcc -o mian main.c p.o
./mian

结果示意:

C++调用C接口的更多相关文章

  1. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  2. C#动态调用WCF接口,两种方式任你选。

    写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...

  3. python调用zabbix接口实现Action配置

    要写这篇博客其实我的内心是纠结的,老实说,我对zabbix的了解实在不多.但新公司的需求不容置疑,当我顶着有两个头大的脑袋懵懵转入运维领域时,面前摆着两百多组.上千台机器等着写入zabbix监控的需求 ...

  4. HttpClient Get/Post方式调用Http接口

    本节摘要:本节主要分别介绍如何用get方式.post方式向http接口发送数据. preparation 1. 项目环境如下: myeclipse6.5 .tomcat5.0.system:xp.JD ...

  5. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )

    Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php ) 1.1. 这些流氓软件使用操作系统os提供的普通api根本就杀不掉啊1 1.2. 使用 ...

  6. Java调用webservice接口方法

                             java调用webservice接口   webservice的 发布一般都是使用WSDL(web service descriptive langu ...

  7. php中创建和调用webservice接口示例

    php中创建和调用webservice接口示例   这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...

  8. 调用c++接口类

    调用c++接口类 public class CarDeviceDll { /*对dll库进行一些初始化*/ [DllImport("IDI.dll")] public static ...

  9. android应用程序如何调用支付宝接口

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  10. 使用soapui调用webservice接口

    soapui是专门模拟调用webservice接口的工具,下面介绍下怎么使用: 1.下载soapui并安装: 2.以免费天气获取接口为例:http://www.webservicex.net/glob ...

随机推荐

  1. 微信小程序--基于ColorUI构建皮皮虾短视频去水印组件(仅供学习使用)

    微信小程序--基于ColorUI构建皮皮虾短视频去水印组件(仅供学习使用) 没错,我是皮友,我想学习舞蹈(/doge)和瑜伽 ,要无水印的那种有助于我加深学习. 1.组件效果展示 2.组件引入准备 h ...

  2. php 计算2点之间的距离

    //获取该点周围的4个点 $distance = 1;//范围(单位千米) $lat = 113.873643; $lng = 22.573969; define('EARTH_RADIUS', 63 ...

  3. PageHelper使用步骤

    一.导入jar包(maven构建导入坐标) <dependency> <groupId>com.github.pagehelper</groupId> <ar ...

  4. Java线程池原理及分析

    线程池是很常用的并发框架,几乎所有需要异步和并发处理任务的程序都可用到线程池. 使用线程池的好处如下: 降低资源消耗:可重复利用已创建的线程池,降低创建和销毁带来的消耗: 提高响应速度:任务到达时,可 ...

  5. NOI2020D1T1美食家

    传送门:QAQQAQ 完了完了NOI签到题全班打不出来,真就全部成为时代的眼泪了... 首先$O(mT)$的$dp$显然,然后因为$T$很大$w$很小矩阵快速幂显然,但是有$k=200$卡不过去. 然 ...

  6. How to using expression setup BackgroundColor AX2012 SSRS Report[AX2012]

    tile label using [#99ccff] property BackgroundColor - > expression =Iif(Fields!Flag.Value = " ...

  7. 一年前,我来到国企搞IT

    ​ 2020.11.01日,这一天是我加盟xxx国企的一年整,这篇分享本来是要提前写的,不过由于前段时间确实繁忙,一直没有机会提笔.今天简单和大家分享下我在国企的一些工作内容,感悟等等,希望能给那些对 ...

  8. 蒲公英 · JELLY技术周刊 Vol.30: 此路不通?Vue 3 新提案 Ref-sugar

    蒲公英 · JELLY技术周刊 Vol.30 随着 Vue 3 发布,相关的新闻也逐渐火热起来,而近期 RFC 中两个新的提案也因为某乎上的一些事情变得广为人关注.Ref sugar和script s ...

  9. 两种图片下拉放大效果实现(自定义CoordinatorLayout以及自定义Recylerview)

    一.自定义CoordinatorLayout实现图片放大功能 本文是基于折叠布局实现的图片上拉滑动,下拉图片放大,松手放大的效果,先看下效果图. 实现原理: 1.使用CoordinatorLayout ...

  10. mysql调优从书写sql开始

    理论知识 MySQL 的运行机制 Mysql 的SQL关键字执行顺序 1.MySQL 的优化方案有哪些? MySQL 数据库常见的优化手段分为三个层面:SQL 和索引优化.数据库结构优化.系统硬件优化 ...