c++11 string u8_C++11编译器的支持

一直以来我都挺喜欢编译的,这次移植hprose对编译器的特性有了更深一些的了解。

首先是检测编译器对C++0x和C++11的支持。

C++0x定义了:

#define __cplusplus 1#define __GXX_EXPERIMENTAL_CXX0X__ 1

C++11定义了:

#define __cplusplus 201103L#define __GXX_EXPERIMENTAL_CXX0X__ 1

C++14定义了:

#define __cplusplus 201402L#define __GXX_EXPERIMENTAL_CXX0X__ 1

所以,要检测是否c++11,则一般使用#if __cplusplus >= 201103L

如果失败再尝试使用GXX_EXPERIMENTAL_CXX0X来检测。

而对于C语言的宏,则可以通过以下形式来验证编译器支持。

arm-linux-androideabi-gcc -dM -E - < /dev/null

其次是GCC编译器对C++11的特性支持。stoi/stod和to_string系列函数其实很早就引入了GCC(< 4.5),但是由于宏定义的问题,在多平台上经常不能使用,这个状况在GCC 6的时候予以了解决。More fine-grained autoconf checks for C99 library · gcc-mirror/gcc@bdb62e6

codecvt用于编码转换,在GCC 5时引入,在GCC 7(C++17)时废弃。关于codecvt有一篇文章写的很好,C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换。需要注意的是:codecvt_utf8 封装了UTF-8与UCS2及UTF-8与UCS4的编码转换,codecvt_utf16 封装了UTF-16与UCS2及UTF-16与UCS4的编码转换,codecvt_utf8_utf16 封装了UTF-8与UTF-16的编码转换

GCC 4.9时正则表达式终于可以用了GCC 4.9 Release Series,不过我一直对正则表达式的语法表示一头雾水。。

GCC 4.8时引入了类成员变量函数返回值的左值、右值引用(即Rvalue references for *this,挺有意思的特性),而右值引用早在GCC 4.3就已经支持。以及array的初始化列表。

GCC 4.7时正式启用-std=c++11,之前都是使用-std=c++0x。这个版本引入了类非静态成员的初始化列表,代理构造函数、强类型的enum。并且解决了之前版本lambda的一些编译问题。

GCC 4.6时引入了range based for,即for each。for each也支持数组。并新增了std::begin()和std::end()。并支持了非受限的union,在这之前union只能放POD类型。

GCC 4.5时引入了lambda表达式,大大方便了函数式编程。

模板元编程经常使用的:auto,GCC 4.4引入。

decltype,GCC 4.3引入。

lambda表达式,GCC 4.5引入。

右值引用,GCC 4.3引入。类函数声明的右值引用,GCC 4.8.1引用。

接下来是Visual Studio编译器的限制。Visual Studio不允许使用类名来命名变量,比如:TestStruct2 *TestStruct2;Porting c++ code from unix to windows

Visual Studio通过/utf-8来设置编码和运行时都是使用UTF-8。-utf-8 (Set Source and Executable character sets to UTF-8) Visual Studio 2015开始支持。

Visual Studio的codecvt支持是有Bug的,不能使用char16_t,只能使用uint16_t;同理不能使用char32_t,只能使用uint32_t。如果要使用u16string/u32string做输出,还要配合std::copy来使用。其他语言:让程序跑起来;C++:让程序编译过 - 知乎专栏

再接下来是字符串字面量。

在C++11之前,通常是使用L""来指定宽字符串,但是并没有要求编译器规定宽字符串的存储,对此windows使用的是2个字节,即UCS-2(早期),UTF-16(最新)。

C++11引入了u8"utf-8字符串",u"utf-16字符串",U"utf-32字符串"。以及R"(非转义字符串)"可直接写不用转义的字符串,和对应的utf版本u8R"(utf-8非转义字符串)",uR"(utf-16非转义字符串)",UR"(utf-32字符串)"。

补充,C11的编译器检测宏

C11:gcc -std=c11 -dM -E - < /dev/null

#define __STDC_VERSION__ 201112L

C99:gcc -std=c99 -dM -E - < /dev/null

#define __STDC_VERSION__ 199901L

没指定:__STDC_VERSION__未定义。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值