印象Clang

在将项目转化为跨平台并使用XCode的默认编译器Clang过程中,发现其编译速度快且错误提示更为精准。Clang对C++模板的处理更严格,要求前置声明和按顺序初始化成员变量,这有助于消除潜在bug。尽管Clang3.0对C++11支持不足,但3.1开始支持lambda。对于习惯于cl的for each,Clang则需要适应标准的for循环。总结来说,Clang更严格遵循C++标准,但对C++11的兼容性限制了项目迁移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近打算把项目做成跨平台的,使之能够在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要求构造函数初始化列表里面成员变量的初始化顺序要符合声明的顺序,这样可以消除潜在的bug。

结论
相比cl,Clang更严格执行C++标准。期待Clang尽快更新,对C++11做的更好。目前,项目的代码没办法顺利迁移用Clang编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值