前一段时间尝试了一下C++11,稍微尝试了一下两个特性,做一下简单记录。
一、编译器工具准备
1. 编译了gcc4.7.1和clang3.1,都试了一下。基本上,编译还算顺利。
gcc4.7.1编译,需要mpc gmp mpfr等软件包,这个在运行./configure的时候会有提示。把这几个包下载后,解压源码源码放到gcc4.7.1的源码目录,然后执行一下语句:
mkdir build cd build && srcdir/configure --progrom--suffix --enable-language=c,c++ --disable-mutilib #需要--disable-mutilib,不然编译可能会出现其他问题
2. 编译clang3.1也比较容易,直接看带的说明文件就可以。简单点说,将LLVM加clang都下载下来,解压后,把clang源码放到LLVM文件夹中,执行编译就可以。另外,如果需要使用C++的库的话,还需要编译stdc++的库。
二、试用C++11
如果使用c++进行编译,编译时需要添加特殊的参数,指定需要c++11标准和使用c++11的库,如:clang++ -std=c++11 -stdlib=libc++
1. 编译旧代码
编译旧代码基本上没有什么问题,主要是一些编译器宏定义需要修改,这个可能在使用一些比较老的库的时候会遇到。简单来说,c++11会对之前的标准兼容。
2. 新特性试用
简单的写个程序试用了一下function库,及lambda表达式,auto类型推导等,感觉还不错。不需要引入第三方库就能使用这些类function功能,还是挺方便的。其lambda表达式,auto类型推导也对编码的简化起到了比较大的作用。
三、发现的一些问题
1. auto有些时候还好,有些时候推导错误,不能通过编译。有时候在gcc中编译没问题,在clang中就会有问题,这个如果不出好,会将会导致auto的实用性大大降低。希望后面会改善。
2. lambda表达式,感觉调试起来不太好调试。
3. clang 与 gcc编译的二进制库某些地方是不兼容的,如使用std::base_string等时候,这时候会有link error,需要把使用这些类的库重新编译一下才可以。
4. 据clang自己提供的数据,其编译速度会比gcc快点,但我的实际感觉是有点gcc会快点,不知道为什么。另外,两个编译出来的程序,运行速度差距不大,应该在5%左右,当然,此数据只是估计。
最后,期待编译器对c++11支持的继续完善。