C++调用C代码

一个C语言文件p.c

#include

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

using namespace std;

#include "p.h"

int main()

{

cout<

print(3,4);

return 0;

}

执行命令

gcc -c p.c

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

编译后链接出错: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

#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接口的实现示例的文章就介绍到这了,更多相关C++调用C接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

c语言调用c 接口方法,C++调用C接口的实现示例相关推荐

  1. smali语言详解之方法的调用

    smali语言详解之方法的调用 一.方法调用关键字介绍 smali语言方法调用关键字主要有以下五种 invoke-virtual主要用于非私有实例方法的调用.实例方法指不是构造方法.父类方法等的属于这 ...

  2. c 调用java post方法_C#调用Java方法(详细实例)

    C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL C#调用c++ C#调用 ...

  3. java 调用对象的方法_JAVA调用对象方法的执行过程

    JAVA调用对象方法的执行过程: ①.编译器查看对象的声明类型和方法名.假设调用x.f(parameter),  且隐式参数x声明为C类型的对象,有可能在C对象中存在多个参数类型和参数个数不同的f的方 ...

  4. java 接口方法名重复_Java接口/实现命名约定[重复]

    本文翻译自:Java Interfaces/Implementation naming convention [duplicate] This question already has an answ ...

  5. Spring 接口方法异步调用

    对外开放的接口,在被外部调用时,需要校验接收到的数据,校验通过后才能开始进行数据处理,处理完成后向特定地址返回结果. 校验通过后即返回接口调用的响应信息,就涉及到方法的异步调用.在 Spring 框架 ...

  6. java list接口方法_java List集合接口的坑

    原标题:java List集合接口的坑 java推荐面向接口编程,我们一般写函数参数的时候总会选择接口的声明,然后根据接口的方法来进行操作.这里说说list的一个坑. 说起list的实现类,你一定能想 ...

  7. c语言ceiling的使用方法,C# Math.Ceiling()用法及代码示例

    在C#中,Math.Ceiling()是Math类方法.此方法用于查找最小整数,该整数大于或等于传递的参数. Celing方法同时使用十进制和双精度两种功能.通过向其传递不同的参数,可以使其重载. M ...

  8. java接口方法默认权限_java 接口内定义方法的权限是什么?

    画数据流图和用例图 某高校欲开发一个成绩管理系统,记录并管理所有选修课程的学生的平时成绩和考试成绩,其主要功能描述如下: 1.每门课程都有3到6个单元构成,每个单元结束后会进行一次测试,其成绩作为这门 ...

  9. c调用按钮点击事件_Unity3d---对UI事件接口的一些测试和机制(坑)的总结

    开文来记录一下自己摸索到的UI事件接口的一些运作机制(坑),就不赘述具体怎么使用这些事件接口了(不做教学...),本文主要是记自己发现的一些坑点 主要针对于在复杂的UI嵌套关系下,鼠标指针和拖拽操作的 ...

最新文章

  1. mysql默认无密码的问题
  2. linux npm安装_怎样在Linux上开发vue项目
  3. python计算最大公约数和最小公倍数_python怎么求最大公约数和最小公倍数
  4. java对象的内存结构_JAVA 对象内存结构
  5. 《Linux内核分析》MOOC课程之从汇编语言角度看计算机是如何工作的
  6. 如果Laravel 报错 file_put_contents(): failed to open stream
  7. mac下shell给文件名批量加前缀
  8. 网站决策分析软件WebBI
  9. r语言library什么意思_还没张口对方就知道你是什么意思了?你的肢体语言出卖了你哦~...
  10. 零基础学云计算怎么样?2020年云计算学习路线
  11. L2-024. 部落-PAT团体程序设计天梯赛GPLT
  12. 计算机网络(十三),Socket编程实现TCP和UDP
  13. out memory 内存溢出总结
  14. 拓端tecdat|Matlab马尔可夫区制转换动态回归模型估计GDP增长率
  15. sql插入时返回插入主键id(id位自动增长)
  16. ORA-28002 Oracle口令过期
  17. 【渗透】浅谈webshell隐藏
  18. Java map转JSON
  19. 小时候玩过的游戏之十八——丢沙包
  20. 安卓10源码添加系统服务后配置SeLinux让其拥有Sdcard读写权限

热门文章

  1. Android通过Mapping文件retrace混淆后的堆栈
  2. Jimoshi_三大框架完成DLS-物流管理系统的车辆管理系统增删改
  3. 计算机维护方面的知识和技巧,电脑系统维护小常识有哪些 四大维护电脑的技巧推荐...
  4. K8S实战:Centos7上集群部署
  5. 什么是人工神经网络模型,神经网络模型可解释性
  6. Modbus RTU 协议详解
  7. 是时候让互联网颠覆婚庆行业了
  8. c语言中黑色的鼠标变宽,大师解答win7系统鼠标光标变成黑色方块了的设置方案....
  9. 如何解决不存在的问题
  10. Flink CDC 2.x 让一切变得美好