(三)宏 __cplusplus C/C++混合编程
前面一些篇目的内容作为一个在校生,很少用到,可能工作的人会见得多一点,但是第一次整体性的学习还是不希望有落下的东西,虽然不常用但至少要有个印象
那么就进入第三篇《宏 __cplusplus》
在C与C++混合编写的代码中,我们常常会在头文件里面看到如下的声明:
#ifdef __cplusplus
extern "C" {
#endif
//一些代码
#ifdef __cplusplus
}
#endif
这些类型的头文件可以被#include 到C文件中进行编译,也可以被#include 到C++文件中进行编译。
一般用于将C++代码以标准C形式输出,就是以C的形式被调用,但C++和C的编译器还是不同的,上述方式使得C中调用C++代码是安全的。
__cplusplus是cpp中的自定义宏,定义的这个宏表示这是一段cpp的代码
代码的含义就是:如果这是一段cpp的代码,那么加入extern “C”{ 和 }处理其中的代码。
C++和C对产生的函数名字的处理是不一样的,在编译生成的汇编码中,要对函数的名字进行一些处理。(由于还没学汇编,具体原理可以看一下其他人分析:http://blog.csdn.net/thanklife/article/details/7362893)
由于extern “C”可以一直C++对函数名、变量名等符号进行名称重整,因此编译出的C目标文件和C++目标文件中的变量、函数名称等符号都是相同的(否则不相同,原因在上一段提到),链接器可以可靠地对两种类型的目标文件进行链接。这样该做法称为了C与C++混用头文件的经典做法。
上述的代码应用,请参见:http://blog.csdn.net/thanklife/article/details/7362893,好像这个博客的前面是一个图片,边界不完整,后面有键盘敲的还是挺完整的,最后有相关的C函数以及文件的扩展调用例子。
那么,我们接着看下面部分。
我们可能认为__cplusplus 这个宏只有“被定义了”和“未被定义”两种状态。事实上却并非如此,__cplusplus 这个宏通常被定义为一个整型值。而且随着标准变化,__cplusplus 宏一般会是一个比以往表顺更大的值。
比如在C++03标准中,__cplusplus的值被预定为199711L,而在C++11标准中,宏 __cplusplus 被预定义为201103L 。这点变化可以为代码所用。
比如程序员在想确定代码是使用支持C++11编译器进行编译时,那么就可以按下面的方法进行检测:
#if __cplusplus < 201103L
#error "should use C++11 implementation"
#endif
这里,使用了预处理指令#error ,这使得不支持C++11的代码编译立即报错并终止编译。
测试效果如下:
C++11标准测试:

C++03标准测试:

关于#if 和 #error机制处理头文件引用处理问题,见下一篇:http://www.cnblogs.com/lv-anchoret/p/8412923.html
就到这里了,感谢您的阅读,生活愉快~
(三)宏 __cplusplus C/C++混合编程的更多相关文章
- FFT原理及C++与MATLAB混合编程详细介绍
一:FFT原理 1.1 DFT计算 在一个周期内的离散傅里叶级数(DFS)变换定义为离散傅里叶变换(DFT). \[\begin{cases} X(k) = \sum_{n=0}^{N-1}x(n)W ...
- C和C++混合编程(__cplusplus 与 external "c" 的使用)
转自:http://blog.csdn.net/ljfth/article/details/3965871 第一种理解比如说你用C++开发了一个DLL库,为了能够让C语言也能够调用你的DLL输出(Ex ...
- C和C++混合编程中的extern "C" {}
引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...
- [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招
一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...
- c/c++实现混合编程
在开发中大家经常会使用到c与c++混合编程,这样能够更好的实现功能模块.刚学习了一下c和c++的混合编程,参考了网上的相关知识,在这里留下要点,方便以后进行查阅. 1.extern关键字 extern ...
- 【C/C++】struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招
本文为笔者阅读<嵌入式C精华>的摘录,推荐一下,不错的书 一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
- 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)
本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...
- swift 与 OC 混合编程
原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...
随机推荐
- HTML5新增的本地存储功能(笔记)
HTML5新增的本地存储功能分为两种,分别对应两个JS对象:①本地存储对应localStorage对象,主要用于长期保存整个网站的数据(这些数据可以永久保存在客户端电脑硬盘内).②会话存储对应sess ...
- Javascript Ajax异步读取RSS文档
RSS 是一种基于 XML的文件标准,通过符合 RSS 规范的 XML文件可以简单实现网站之间的内容共享.Ajax 是Asynchronous JavaScript and XML的缩写.通过 Aja ...
- 【Foreign】tty的方程math [数学]
tty的方程math Time Limit: 50 Sec Memory Limit: 128 MB Description 给定n.m.k.p. a+b+c=n, a^2+b^2+c^2=m, a ...
- Centos7网络配置(VMware)
在VM虚拟机上装了Centos7,想要用xshell5连接操作,配置网络花了整整一个上午的时间,真是心酸. 登陆后,使用命令 ip addr查看了本机的网络 可以看到我的网络配置文件是ens33, 使 ...
- 字符串hash&&对字符串hash的理解
对字符串hash的一些总结: 1,首先,我们在转化的时候,取底的时候一般是取131这些数,因为要避免不同的字符串对应相同的hash值这种情况的出现.如果卡精度的时候,我们可以采取双模数的方式尽量减少 ...
- 正则表达式入门之学习路线&七个问题
由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用: 最全的常用正则表达式大全——包括 ...
- day10作业
1.Java中,用{}括起来的代码称为代码块. 代码块分为局部代码块,构造代码块,静态代码块,同步代码块 局部代码块:在方法中出现,限定生命周期,及早释放,提高内存利用率 构造代码块:在类中方法外出现 ...
- bootstrap File Input 多文件上传插件使用记录(二)删除原文件
在上一篇文章中,主要介绍了file input插件的初始化和多文件同步上传到服务器的相关配置等.这篇主要介绍file input插件的编辑等. 使用场景: 在后台管理框架中,一条数据中包含不固定的多张 ...
- linux下Ctrl命令组合
1.键盘组合键操作 ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程.常用于终止正在运行的程序. ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程. ...
- Centos之链接命令
链接命令:ln (link) ln -s [源文件] [目标文件] 功能描述:生成链接文件 选项: -s 创建软链接 硬链接特征: 1,拥有相同的i节点和存储block块,可以看作是同一个文件: 2 ...