美文网首页每天写500字
[C++11阅读][1-2-1]对C标准的兼容

[C++11阅读][1-2-1]对C标准的兼容

作者: 凌霄阁2010 | 来源:发表于2020-05-12 10:18 被阅读0次

    与C99兼容

    C++11之前最新的C标准是1999年的C99标准。
    C++98出现在C99之前,对C99支持不好,各编译器自己把握,C++11对C99中特性进行了支持,包括

    • C99中的预定义宏
    • __func__预定义标识符
    • _Pragma操作符
    • 变长参数宏定义和__VA_ARGS__
    • 宽窄字符串连接

    预定义宏

    C99相比C89新增了几个预定义宏,C++11也兼容这些宏,以下是C++11中与C99兼容的预定义宏,



    我的补充
    有命令可以输出编译器内部预设全部常量宏定义,实测OK。

    gcc -E -dM test.c
    g++ -E -dM test.c
    arm-linux-gcc -E -dM test.c
    

    __func__预定义标识符

    还有__FILE__、__LINE__等,叫做预定义标识符。
    __func__不被之前的C++版本支持,例如vc6.0。
    功能是返回函数名,不赘述了。
    我的补充
    几个func宏的区别,
    https://stackoverflow.com/questions/4384765/whats-the-difference-between-pretty-function-function-func

    _Pragma操作符

    C语言的#define、#undef、#error、#pragma等,叫做预处理指令,#pragma是其中最复杂的一个。
    C++11中的_Pragma操作符,相当于C语言的#pragma,即以下两句是等价的。

    // in C99
    #pragema once
    // in C++11
    _Pragma("once");
    

    我的补充
    https://blog.csdn.net/piaoxuezhong/article/details/58586014

    变长参数宏定义

    #include <stdio.h>
    #define LOG(...) { \
        fprintf(stderr, "%s: Line %d:\t", __FILE__, __LINE__, __VA_ARGS__); \
        fprintf(stderr, __VA_ARGS__); \
        fprintf(stderr, "\n"); \
    }
    

    我的补充
    主要搭配printf打日志用的,C++里用不大着,而是选择用<<。

    宽窄字符串连接

    窄字符串是char,宽字符串是wchar_t。
    之前标准不支持两种字符串相连,C++11支持相连,处理是先把char转成wchar_t。
    我的补充
    宽窄字符串的编码方式不一样。
    https://www.cnblogs.com/jmliao/p/6031818.html

    __cplusplus

    判断是否用C++编译。与extern "C"结合使用,可以disable名称重整(name mangling),使C++编出来的变量和函数名称等符号与C相同,不改名。

    #ifdef __cplusplus
    extern "C" {
    #endif
    // some declaration
    #ifdef __cplusplus
    }
    #endif
    

    相关文章

      网友评论

        本文标题:[C++11阅读][1-2-1]对C标准的兼容

        本文链接:https://www.haomeiwen.com/subject/qilpnhtx.html