由于C++编译器需要支持函数的重载,会改变函数的名称,因此dll的导出函数通常是标准C定义的。这就使得C和C++的互相调用变得很常见。但是有时可能又会直接用C来调用,不想重新写代码,让标准C编写的dll函数定义在C和C++编译器下都能编译通过,通常会使用以下的格式:(这个格式在很多成熟的代码中很常见)
#if defined(__cplusplus)//只有c++编译器才有这个宏定义。
extern "C" {
#endif
// 在这里写标准C程序,例如dll导出函数的定义
#ifdef __cplusplus
     }
#endif

下面解释一下上面的代码:
      首先__cplusplus是C++编译器内部定义的宏,如果使用的C编译器,__cplusplus宏不会被定义。它可以作为区分使用的是C编译器还是C++编译器的标志。在标准C中C代码直接写就可以了。而在C++中,需要加extern "C"或包含在extern "C"块中。

由于标准C是不支持extern "C"的,会产生变异错误,所以使用预编译指令通过__cplusplus来判断只有在使用C++编译器的时候才定义extern "C"。

意思是说,如果是C++程序,就使用
extern "C"{
而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的

extern "c" 函数描述 指定它为C函数

extern "C"表示编译生成的内部符号名使用C约定

C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不 同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。下面以例子说明,如何 在C++中使用C的函数,

http://www.cnblogs.com/HappyXie/archive/2011/01/07/1929369.html

转载于:https://www.cnblogs.com/azbane/p/8522625.html

#if defined(__cplusplus)相关推荐

  1. #if defined和#if !defined的含义

    对于大型项目一般要用到许多宏定义,那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种情况提供了解决方案. #define ....  ...

  2. #if defined和#if !defined(c语言的宏定义)

    因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦.if defined宏正是为这种 ...

  3. iOS音频——AudioToolbox

    一.前言 二.音频文件Audio File Services 三.音频文件转换Extended Audio File Services 四.音频流Audio File Stream Services ...

  4. redis 之 sds (二) char []

    为什么80%的码农都做不了架构师?>>>    可以先看看: https://my.oschina.net/tsh/blog/974033 http://coolshell.cn/a ...

  5. SWIG和PInvoke学习(1)

    1. 简介 SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具. SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, ...

  6. CoreCLR系列随笔 之ClrJit项目之alloc.cpp文件分析(1)

    首先声明,自己对CLR了解得不多,只是个人爱好,可能有错误,请指出,文件源码如下(可能不是最新的) // // Copyright (c) Microsoft. All rights reserved ...

  7. DSP/BIOS中的数据类型

    DSP/BIOS API并非像C语言一样直接采用如int或char的数据类型.然而,为了保证与其他处理器的DSP/BIOS API兼容性,DSP/BIOS定义了自己的标准数据类型.下述数据类型在std ...

  8. io.h源码 检查文件是否存在

    请问在windows上使用什么API来检查文件是否存在? http://topic.csdn.net/u/20080929/00/48833cf7-125f-4075-881f-614a51fc3e6 ...

  9. vc2005编译ffmpeg以及ffplay

    ffmpeg编译过程: 1 http://ffmpeg.zeranoe.com/builds/  下载官方提供的源码,win32库和dll. 2 新建vc2005 console空工程,把ffmpeg ...

最新文章

  1. 你也能与AlphaGo谈笑风生:AlphaGo教学工具上线,2万多变化,37万多步棋
  2. 52个有用的 Docker 工具
  3. neo4j 连接java
  4. Js黑客帝国效果 文字下落 制作过程和思路
  5. 市值突破3000亿,Fortinet发布2021Q2财报
  6. JavaScript的事件执行机制及异步
  7. java dom读写xml文件_java通过dom读写xml文件
  8. unix和linux命令_Linux / UNIX中的cp命令
  9. mysql 查看当前连接及修改连接数
  10. -lavutil -lavcodec -lavdevice -lavfilter -lavformat链接失败,换用-lffmpeg
  11. 最新凌风云支付系统网站源码全解无后门V4.1.1版本
  12. 计算机机房检查内容,IDC数据中心机房日常运维巡检工作的正确姿势
  13. AlphaGo 原理讲解(附代码)
  14. Maven的setting仓库配置
  15. Mac上批量修改文件的编码格式
  16. Nginx 关于 Rewrite 执行顺序详解
  17. bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)...
  18. BlockChain的理解
  19. 教你如何用UltraISO制作U盘系统安装盘(图文教程)
  20. 称硬币问题-Python

热门文章

  1. 解决crontab 定时任务加载失败
  2. oracle导出数据dummy,oracle导出表结构1
  3. mysql基础查询语法
  4. 各大高校女生节横幅来袭,个个都是段子手
  5. 超融合和服务器关系_超融合与传统服务器区别
  6. python fsolve说明_Python fsolve()抱怨形状.为什么?
  7. linux中profile文件作用,解析Linux系统中bashrc和profile文件的作用区别
  8. 特征选择算法java实现_relief算法特征选择
  9. figma下载_迁移至Figma
  10. 控制台ui_设计下一代控制台UI