一、版本简介
1. C++98:ISO/IEC 14882:1998
命名空间:std
最古老版本的C++标准
2. C++03:ISO/IEC 14882:2003
命名空间:std
3. TR1:C++ Technical Report 1
命名空间:std::tr1
作为C++03的扩展,但是其中一些最终被引入C++11
因为TR1只是C++03的扩展,因此编译器本身不强制要求支持TR1。但是TR1中的大部分内容都在boost::tr1中有体现。
4. Boost:
命名空间:boost
boost是基于C++03实现的一个增强版的C++库,他的很多库已经被引入TR1,TR2,而TR1中大部分的内容已经引入C++11。
5. C++11(C++0x):ISO/IEC 14882:2011
命名空间:std
引入大部分TR1的内容
6. TR2:C++ Technical Report 2
作为C++11的扩展
二、C++编译器
1. 编译器的结构
frontend用于做语法分析,将程序语言转化成中间语言。
backend用于将中间语言转化成机器语言。
2. GCC,LLVM,Clang
GCC4.2的前端和后端都是GCC自己来实现的。
LLVM-GCC的前端是GCC,后端是LLVM
LLVM Compiler,也就是Clang,前端是Clang,后端是LLVM
LLVM本身是一个后端
3. gcc与g++的区别gcc:GNU Compiler Collection,本身是一个工具集
g++:C++ Compiler,因此是gcc的一个子集,g++自动使用libstdc++,实际上g++还是用的gcc
4. libstdc++与libc++
MAC下,前者使用的C++版本是C++03,后者是C++11,使用C++03编译的库与使用C++11的库ABI不兼容
ABI不兼容:
4.1. 如何查看一个二进制使用的lib:
otool -L <file>
4.2. Mac使用C++11编译程序:
./configure CC=clang CXX=clang++ CXXFLAGS='-stdlib=libc++'