时常在cpp的代码之中看到这样的代码:

#ifdef __cplusplus
extern "C" {
#endif
//一段代码
#ifdef __cplusplus
}
#endif

这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。

  要明白为何使用extern "C",还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. 目的就是主要实现C与C++的相互调用问题。

c.h的实现

#ifndef _c_h_

#define _c_h_

#ifdef __cplusplus

extern "C" {

#endif

void C_fun();

#ifdef __cplusplus

}

#endif

#endif

-----------------------------------

c.c的实现

#include "c.h"

void C_fun()

{

}

------------------------------------

在cpp.cpp中调用c.c中的C_test()

cpp.cpp的实现

#include "c.h"

int main()

{

C_fun()

}

其中__cplusplus是C++编译器的保留宏定义.就是说C++编译器认为这个宏已经定义了.

所以关键是extern "C" {}

extern "C"是告诉C++编译器件括号里的东东是按照C的obj文件格式编译的,要连接的话按照C的命名规则去找.

==========================

那么C中是如何调用C++中的函数cpp_fun()呢?

因为先有C后有C++, 所以只能从C++的代码中考虑了.

加入C++中的函数或变量有可能被C中的文件掉用,则应该这样写,也是用extern "C"{}

不过是代码中要加,头文件也要加,因为可能是C++中也调用

--------------------------------------

cpp.h的实现

#ifndef _c_h_

#define _c_h_

#ifdef __cplusplus

extern "C" {

#endif

void CPP_fun();

#ifdef __cplusplus

}

#endif

#endif

.-------------------------------------------

Cpp.cpp的实现

extern "C" {    //告诉C+++编译器,扩号里按照C的命名规则编译

void CPP_fun()

{

.....

}

总结

  C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

#ifdef _cplusplus(转)相关推荐

  1. #ifdef _cplusplus是什么意思

    时常在cpp的代码之中看到这样的代码: #ifdef __cplusplusextern "C" { #endif //一段代码 #ifdef __cplusplus } #end ...

  2. “#ifdef __cplusplus extern C { #endif”的定义(zz)

    "#ifdef __cplusplus extern "C" { #endif"的定义 看一些程序的时候老是有 "#ifdef __cplusplus ...

  3. #ifdef __cplusplus extern C { #endif”的定义的含义

    看一些程序的时候老是有 "#ifdef __cplusplus extern "C" { #endif"的定义,搞搞清楚是怎么回事: Microsoft-Spe ...

  4. c, c++函数名编译符号修饰符说明

    C++ 编译器的函数名修饰规则 函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串.用来指明函数的定义或原型. LIN ...

  5. lua5.2调用c函数成功的例子

    1. main.c ----------------- //动态库 #include <stdio.h> #include <stdlib.h> #include <st ...

  6. C++项目中的extern C {}

    2010-07-10 19:45 by 吴秦, 92864 阅读, 22 评论, 收藏, 编辑 引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: ? 1 2 3 4 5 6 7 8 9 ...

  7. 空指针,段错误,这场面试我栽倒在这里了!

    作者 | 李肖遥 来源 | 技术让梦想更伟大(ID:gh_f7effb2fbc1c) 面试官:满头的汗的,来面试的路一定很远吧? 还好还好,骑车不到俩小时 面试官:来先喝杯水,咱们面试不急,边喝边聊 ...

  8. vlc学习计划(4)--在EMACS中使用GDB调试

    一 .EMACS 中调试   1.using the clipboard                 M-x  menu-bar-enable-clipboard         (make cu ...

  9. xxl-job 执行结果是空_空指针,段错误,这场面试我栽倒在这里了!

    空指针,段错误,这场面试我栽倒在这里了! NULL在C/C++中的标准定义 NULL的标准定义 #if !defined(NULL) && defined(__NEEDS_NULL) ...

最新文章

  1. Linux监控工具dstat
  2. mysql创建和删除用户
  3. android中怎么网络判断,Android中判断网络是否连接实例详解
  4. 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
  5. Linux 下系统调用的三种方法
  6. bootstrap布局两列或者多列表单
  7. 非阻塞IO与异步IO
  8. Consumer搭建
  9. 致SEO初学者:学习SEO要注意的几个问题
  10. 51. 顺时针打印矩阵[print matrix in clockwise direction]
  11. php正规则表达式学习笔记(几个常用函数的区别)
  12. 【python】1. 两数之和
  13. Object类 java 1614965390
  14. 在自己的电脑上搭建服务器(可供对外访问)
  15. Linux 命令(141)—— nmap 命令
  16. html 自定义标签 ios,iOS标签 | 菜鸟教程
  17. linux 命令行下载BT种子和磁力链接 ubuntu linux 命令行下载种子
  18. android Tbs腾讯X5内核初始化失败
  19. 作品展作品延伸——代码
  20. goeasy服务器发送(发布)消息,python服务端使用GoEasy实现websocket消息推送

热门文章

  1. 苹果付费app共享公众号_【苹果付费APP共享】 Affinity Photo
  2. webpack/vue-cli 中的 publicPath / 和 ./ 的区别
  3. HaaS UI小程序解决方案基础教学之二: 搭建第一个UI页面
  4. Filecoin节点部署
  5. python主程序退出方法quit()
  6. 只能选一次,30万亿房贷明年将按LPR定价
  7. 本地音乐如何导入apple_如何将Apple音乐歌曲用作iPhone闹钟
  8. 骨传导蓝牙耳机哪款好,性价比较高的骨传导耳机推荐
  9. 猫和老鼠服务器维护多久结束,《猫和老鼠》母猫玩家遇到4个杰瑞,5分钟后,她想挂机了!...
  10. orCAD 中 WARNING(ORCAP-2435): Number of pins in footprint ‘x‘ and instance ‘u?A‘ does not match