在编译的过程中遇到不少问题,整理了如下几点:
编译速度
跟传说中的一样,确实很快。
错误提示
Clang的提示比cl精准一些,尤其是模版方面,不会有一堆错误信息。
模版支持
想比cl,Clang对标准的执行更严格些,或者说更死板些。
比如:
1 template<class X>
2 void doSomething(const X& x)
3 {
4 doOthering(x);
5 }
6 template<class Y>
7 void doOtherthing(const Y& y)
8 {
9 .
10 }
2 void doSomething(const X& x)
3 {
4 doOthering(x);
5 }
6 template<class Y>
7 void doOtherthing(const Y& y)
8 {
9 .
10 }
doOtherthing声明在doSomething之后,但却在doSomething中使用。在这种情况下,cl编译是没有问题。在模版中,Clang也需要前置声明doOtherthing。
另外对typename的处理跟cl也有出入。幸好支持the new auto,所以能用auto的地方就大胆的用auto吧。
标准支持C++11
Clang3.0对C++11的支持太弱。std::shared_ptr, lambda, the new for统统不支持。Clang3.1加入了lambda支持。
cl2010也不支持the new for,但提供了个for each。for each用起来很爽,但要跨平台就得改啦!
其他
Clang要求构造函数初始化列表里面成员变量的初始化顺序要符合声明的顺序,这样可以消除潜在的bug。
结论
相比cl,Clang更严格执行C++标准。期待Clang尽快更新,对C++11做的更好。目前,项目的代码没办法顺利迁移用Clang编译。