C++代码调用C函数:

在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:

extern "C"

{

#include "cExample.h"

}
  而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。
  笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下:

       //C函数头文件        cExample.h

#ifndef C_EXAMPLE_H

#define C_EXAMPLE_H

extern int add(int x,int y);

#endif

//C函数实现文件        cExample.c
     #include "cExample.h"
     int add( int x, int y )
     {
            return x + y;
     }
     // c++实现文件,调用add:cppFile.cpp
     extern "C" 
     {
     #include "cExample.h"
     }
     int main(int argc, char* argv[])
     {
            add(2,3); 
            return 0;
      }

如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }

C代码调用C++函数:

在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅在C文件中将C++中定义的extern "C"函数声明为extern类型。
  笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下:

 //C++头文件 cppExample.h
        #ifndef CPP_EXAMPLE_H
        #define CPP_EXAMPLE_H
        extern "C" int add( int x, int y );
        #endif
        //C++实现文件 cppExample.cpp
        #include "cppExample.h"
        int add( int x, int y )
        {
                return x + y;
        }
        //C文件        main.c
       extern int add( int x, int y );
       int main( int argc, char* argv[] )
      {
             add( 2, 3 ); 
             return 0;
       }

总结:

在C++中调用C代码,要在C++文件中加入extern "C" {}去告诉我们的编译器,该段代码使用C的方式调用。因为这些代码是在.c文件中编写,它们是被编译成C的形式,所以需要使用C的调用方式。

在C中调用C++代码,则要在C++文件中加入extern "C",告诉编译器把字段代码编译成C的形式,以便我们在.c文件中直接调用。

extern "C" {}经常在头文件里结合 __cplusplus 一起使用,例如:

#define PR_BEGIN_EXTERN_C       extern "C“ {

#define PR_END_EXTERN_C         }

#ifdef __cplusplus

PR_BEGIN_EXTERN_C

#endif

extern void function(int a);

#ifdef __cplusplus
PR_END_EXTERN_C
#end

对于C++文件 __cplusplus 会被定义,这样在C++文件中包含该头文件就会自动加入 extern "C" {}

而对于C文件是没有 __cplusplus 的,所以在C文件中包含该头文件就不会加入 extern "C" {}

参考文章:

https://blog.csdn.net/guoxiaoqian8028/article/details/26174443?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.control&spm=1001.2101.3001.4242

C++和C语言函数相互调用相关推荐

  1. c语言中go的作用,go语言与c语言的相互调用

    由于工作原因,需要实现go语言与c语言的相互调用.由于go语言与c语言有着千丝万缕的暧昧关系,两者之间的调用可以通过语言层面实现.下文是对此的总结. ​ go语言调用c语言 以下为一个简短的例子: p ...

  2. c语言函数中调用的参数太多

    c语言函数中调用的参数太多问题 问题展示 问题分析 解决方法 问题展示 (图中是我遇到的情况) 问题分析 大家可以看到,在函数中,指针变量和后面的整数变量都成了灰色 解决方法 图中问题只需将中文逗号, ...

  3. java调用wvsc.exe_c语言 函数的调用方法

    欢迎加入 编程爱好者 QQ群 群号 57616770 中都只有一个主函数main(), 但实用程序往往由多个函数组成.函数是C源程序的基本模块,通过对函数模块的调在第一章中已经介绍过,C源程序是由函数 ...

  4. Python 同一个类中不同函数相互调用

    本文采取:Python的类中函数方法相互调用的两种方式_狗哥的博客-CSDN博客 __metaclass__=type class Stu:name=Noneage=Noneschool=" ...

  5. C语言函数递归调用实验报告,C语言函数的递归和调用实例分析

    一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. ...

  6. 函数定义涉及的三要素C语言,c语言函数的调用

    /* 1. 函数三要素 函数名 形参列表   函数体 2. 如何调用函数? 函数名(); 3.函数体内容书写一定要谨慎 bug  是编程常用  出现了问题 函数哪里需要哪里都可以调用 声明一个函数   ...

  7. matlab子函数相互调用吗,matlab主函数如何调用子函数

    来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2021/03/18 18:00:53 matlab主函数如何调用子函数 我编写了一个matlab子函数是关于龙格库塔计算的 主函数内容为: fo ...

  8. c++和c语言中的函数相互调用的问题

    1.如何C++程序要调用 已编译后的C函数,该怎么办? (1)假设某个C函数的声明如下: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则 ...

  9. C语言函数指针调用函数

    C语言可以定义指针变量指向函数,通过指针来调用函数. 使用: 1.定义函数指针变量:  函数返回值类型 (*指针变量名)(); 2.将已有函数入口赋值给函数指针变量:fnPt = avg; 3.使用指 ...

最新文章

  1. 监督学习和无监督学习_让半监督学习再次伟大!谷歌最新无监督数据增强研究,全面超越现有半监督学习方法...
  2. PTA-习题11-2 查找星期 (15 分)-enum
  3. ptaa乘以b_《C语言程序设计》实验作业--PTA顺序结构练习
  4. 10多家在线旅游企业呼吁海外商家向中国游客提供优惠退改措施
  5. JS对cookie进行操作
  6. AI大牛Jerry Kaplan:AGI?没有技术和工程基础
  7. python基础之字符串类型
  8. 如何避免 obj1 + obj2 = obj3 错误?
  9. 微信小程序图标变形、微信小程序放大镜图标、图片设置为圆形——微信小程序(1)
  10. GitHub的安装与配置
  11. c primer plus 第6版 中文版pdf_内功实力再精进 试驾上汽大通V80 PLUS城市版
  12. winrar5.7.1商业版 无广告 注册下载
  13. 【不三不四的脑洞】一个梦所引发关于排序算法的思考
  14. php 网络留言系统总结心的,留言板_感谢您的留言_代潇瑞博客-专注于PHP学习,PHP源码分享...
  15. 【数据分析】 Titanic乘客获救预测(2)数据处理
  16. 【postgresql】 获取月初月末日期
  17. 用Python做一个游戏辅助脚本(含完整编程思路)
  18. 交换a,b值的三种方法
  19. 工具说明书 - 英语语法检查工具Grammarly
  20. 程序员:必备技能 Git

热门文章

  1. Hibernate 基础配置及常用功能(二)
  2. asp.net mvc 如何在View中获取Url参数的值
  3. 【动态规划】【多重背包】[HDU 1291]悼念512汶川大地震遇难同胞――珍惜现在,感恩生活...
  4. 使用PHP创建一个REST API(Create a REST API with PHP)
  5. C++:cin.getline
  6. int最大值java_Java 中一个int型数组的求最大值最小值 | 学步园
  7. mysql触发器区分新增 修改_MySQL触发器 , 判断更新操作前后数据是否改变
  8. java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别
  9. list取值_Redis中List及quicklist实现-2
  10. read/fread write/fwrite 的区别