最近打算把项目做成跨平台的,使之能够在Mac上运行。做为XCode的默认编译器,据说Clang的编译速度很快,所以决定第一步就需要玩起Clang来。
在编译的过程中遇到不少问题,整理了如下几点:
编译速度跟传说中的一样,确实很快。
错误提示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 }
doOtherthing声明在doSomething之后,但却在doSomething中使用。在这种情况下,cl编译是没有问题。在模版中,Clang也需要前置声明doOtherthing。
另外对typename的处理跟cl也有出入。幸好支持the new auto,所以能用auto的地方就大胆的用auto吧。
标准支持C++11Clang3.0对C++11的支持太弱。std::shared_ptr, lambda, the new for统统不支持。Clang3.1加入了lambda支持。
cl2010也不支持the new for,但提供了个for each。for each用起来很爽,但要跨平台就得改啦!
[修订] clang支持 the new for。与汇编混合编程Clang是不支持的。
如cl支持在C++代码中嵌入asm block:
__asm{
}
其他Clang要求构造函数初始化列表里面成员变量的初始化顺序要符合声明的顺序,这样可以消除潜在的bug。
结论相比cl,Clang更严格执行C++标准。期待Clang尽快更新,对C++11做的更好。目前,项目的代码没办法顺利迁移用Clang编译。