码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • extern “C“的用法


    extern"C"

    • .cpp引入.c函数
    • .c引入.cpp函数

    C++虽然兼容C,但是相同的函数经过C编译器和C++编译器的编译后生成的符号不同,所以C++中使用C语言实现的函数,在编译链接的时候会出错。
    C++为了与C兼容,在符号的管理上,C++有一个用来声名或定义一个C的符号的“extern C”的用法

    .cpp引入.c函数

    add.c

    #include"add.h"
    int add(int x,int y)
    {
        return x+y;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    add.h

    #ifndef ADD_H
    #define ADD_H
    extern int add(int x,int y);
    #endif
    
    • 1
    • 2
    • 3
    • 4

    add.cpp 加上extern"C"之前

    #include
    #include"add.h"
    using namespace std;
    
    int main()
    {
     cout<<add(2,3)<<endl;
     return 0;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    当我们不引入extern"C"时,在链接时会出现错误
    在这里插入图片描述
    add.cpp 加上extern"C"之后

    #include
    using namespace std;
    extern "C"{
        #include"add.h"
    
    }
    int main()
    {
     cout<<add(2,3)<<endl;
     return 0;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    我们经过编译链接之后,成功的输出了结果

    在这里插入图片描述

    .c引入.cpp函数

    add.c

    extern int add(int x,int y);
    #include
    int main()
    {
        printf("%d\n",add(2,3));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    add.cpp

    #include"add.h"
    int add(int x,int y)
    {
        return x+y;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    add.h

    #ifndef ADD_H
    #define ADD_H
    extern"C"{
        int add(int x,int y);
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    经过编译链接之后,得到了正确的结果
    在这里插入图片描述
    总结:
    (1)C++调用C函数:

    //xx.h
    extern int add(...)
    
    //xx.c
    int add(){
        
    }
    
    //xx.cpp
    extern "C" {
        #include "xx.h"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (2)C调用C++函数

    //xx.h
    extern "C"{
        int add();
    }
    //xx.cpp
    int add(){
        
    }
    //xx.c
    extern int add();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    以上是我在GitHub上学习的笔记,原项目的链接在下面。
    CPlusPlusThings

  • 相关阅读:
    【Android 屏幕适配】异形屏适配 ① ( 异形屏类型:刘海屏、水滴屏、挖孔屏 | 沉浸式布局刘海屏适配 | 华为手机异形屏适配注意点 )
    [附源码]计算机毕业设计基于Springboot的中点游戏分享网站
    使用Spring WebFlux和Spring Cloud的反应式微服务
    GCN火车票识别项目 P1 火车票识别项目介绍 Pytorch LSTM/GCN
    【爬虫】(一)fossies.org
    软件工程——结构化设计
    Springboot-mybatis创建项目报错day01
    JS动态加载数据绑定事件 jquery delegate() 方法
    【Linux】Systemd中的 target 是什么?有什么用?如何使用?
    Bean 的作用域和生命周期
  • 原文地址:https://blog.csdn.net/aoeaoao/article/details/126131455
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号