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. js音乐播放器【简洁】

    辞职的第二天没有去找工作还,准备回家. 但到了火车站才发现沃特玛的买的票不是在这个火车站坐. 这就耽误了行程...... 说出来真舒服!!!淦 代码 这里已经上传到码云了,大家可以直接引用. 目前只有 ...

  2. 使用 Xunit.DependencyInjection 改造测试项目

    使用 Xunit.DependencyInjection 改造测试项目 Intro 这篇文章拖了很长时间没写,之前也有介绍过 Xunit.DependencyInjection 这个项目,这个项目是由 ...

  3. vue 格式化日期

    cnpm install moment --save 摘自:https://www.cnblogs.com/zwq20134/p/11718034.html <el-table-column l ...

  4. php 上传音频文件并获取时长

    <input type="file" name="audio" id="voice_file" style="display ...

  5. Python之Matplot——01.堆叠柱状图的绘制

    1.Matplotlib是python的一个绘图库,可以方便的绘制各种图标,是数据可视化的利器. 2.本文我就给大家介绍一下条形图或者说柱状图的绘制 3.代码如下: <1>首先导入模块 1 ...

  6. Docker - 解决 Error response from daemon: driver failed programming external connectivity on endpoint tomcat9999

    问题背景 执行 docker start tomcat 报以下的错误 Error response from daemon: driver failed programming external co ...

  7. jenkins配置邮件报错:501 mail from address must be same as authorization user

    jenkins配置文件的时候,遇到如下报错: 我的配置是这样的: 最后发现是jenkins url下面的系统管理员邮件地址没写,填写与用户名一致就可以了.

  8. c++中的几种函数调用约定(转)

    C++中的函数调用约定(调用惯例)主要针对三个问题: 1.参数传递的方式(是否采用寄存器传递参数.采用哪个寄存器传递参数.参数压桟的顺序等): 参数的传递方式,最常见的是通过栈传递.函数的调用方将参数 ...

  9. uboot分析——makefile

    1.makefile分析 $(TOPDIR)/makefile | |-----> include $(obj)/include/config.mk  确定板子环境 | || | V |---- ...

  10. 一文带你玩转对象存储COS文档预览

    随着"互联网+"的发展,各行各业纷纷"去纸化",商务合同.会议纪要.组织公文.商品图片.培训视频.学习课件.随堂讲义等电子文档无处不在.而要查看文档一般需要先下 ...