zoukankan      html  css  js  c++  java
  • (三)宏 __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 

    就到这里了,感谢您的阅读,生活愉快~

  • 相关阅读:
    BZOJ 1800 [Ahoi2009]fly 飞行棋
    BZOJ 3309 DZY Loves Math
    CAS Server和client 实现单点登录
    单点登录原理与简单实现
    Maven插件
    win10安装最新nexus-3.x及maven简单配置介绍
    oracle获取表的属性,包括字段,注释
    java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
    深入理解Tomcat虚拟目录
    环境搭建系列-系统安装之centos 6.5安装与配置
  • 原文地址:https://www.cnblogs.com/lv-anchoret/p/8412568.html
Copyright © 2011-2022 走看看