美文网首页每天写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