前面一些篇目的内容作为一个在校生,很少用到,可能工作的人会见得多一点,但是第一次整体性的学习还是不希望有落下的东西,虽然不常用但至少要有个印象

那么就进入第三篇《宏 __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++混合编程的更多相关文章

  1. FFT原理及C++与MATLAB混合编程详细介绍

    一:FFT原理 1.1 DFT计算 在一个周期内的离散傅里叶级数(DFS)变换定义为离散傅里叶变换(DFT). \[\begin{cases} X(k) = \sum_{n=0}^{N-1}x(n)W ...

  2. C和C++混合编程(__cplusplus 与 external "c" 的使用)

    转自:http://blog.csdn.net/ljfth/article/details/3965871 第一种理解比如说你用C++开发了一个DLL库,为了能够让C语言也能够调用你的DLL输出(Ex ...

  3. C和C++混合编程中的extern "C" {}

    引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...

  4. [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...

  5. c/c++实现混合编程

    在开发中大家经常会使用到c与c++混合编程,这样能够更好的实现功能模块.刚学习了一下c和c++的混合编程,参考了网上的相关知识,在这里留下要点,方便以后进行查阅. 1.extern关键字 extern ...

  6. 【C/C++】struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    本文为笔者阅读<嵌入式C精华>的摘录,推荐一下,不错的书 一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int ...

  7. matlab和C/C++混合编程--调用opencv

    最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...

  8. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

    本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...

  9. swift 与 OC 混合编程

    原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...

随机推荐

  1. R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

    一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...

  2. 洛谷P3959 [NOIP2017]宝藏

    [题目描述] 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但 ...

  3. 【BZOJ】3160: 万径人踪灭 FFT+回文串

    [题意]给定只含'a'和'b'字符串S,求不全连续的回文子序列数.n<=10^5. [算法]FFT+回文串 [题解]不全连续的回文子序列数=回文子序列总数-回文子串数. 回文子串数可以用回文串算 ...

  4. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  5. 连接mysql提示Establishing SSL connection without server's identity verification is not recommended错误

    Establishing SSL connection without server's identity verification is not recommended. According to ...

  6. [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)

    [NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...

  7. Chip Factory(HDU5536 + 暴力 || 01字典树)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5536 题目: 题意: 对于给定的n个数,求出三个下标不同的数使得(si+sj)^sk最大. 思路: ...

  8. POJ3233_Matrix Power Series_矩阵幂_C++

    题目:http://poj.org/problem?id=3233 这是今天考试的题目,结果没想出来写了个暴力30分,看完题解之后觉得自己是SB 首先暴力就是一个个乘然后相加,时间是O(kn3),极限 ...

  9. STL-set and multiset

    ! ! ! ! set 中的元素总是保持单调递增. set<int> a; set的插入 set没有尾部插入函数push_back(),元素的插入一般使用insert进行动态检索插入. a ...

  10. C++ Primer 5th 第18章 用于大型程序的工具

    C++大规模程序设计至少存在三个特殊要求: 错误处理 库的引入 复杂建模 以上三种对应C++语言的三种特性:异常处理.命名空间.多重继承. 异常处理 异常处理机制是一种允许偷懒的工具,在出现非正确的情 ...