与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
网友评论