力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks
最近打算把项目做成跨平台的,使之能够在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++11
Clang3.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编译。
posted on 2012-07-22 17:40 力为 阅读(1939) 评论(3)  编辑 收藏 引用 所属分类: 4. C++ FAQ

评论

# re: 印象Clang 2012-07-23 09:23 egmkang
你加了-std=c++11么? clang 3.1对C++11的支持应该是非常多的,而且像shared_ptr这种,是在库级别支持的,还不是编译器层面.
http://clang.llvm.org/cxx_status.html 这是clang 3.1的支持列表.  回复  更多评论
  

# re: 印象Clang[未登录] 2012-08-01 13:02 dd
你这个孩子蛋疼.跨平台在编译器上搞什么搞.  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理