clang vs gcc : 代码出错提示功能对比

今天研究c++ const 的问题,顺便做了一下gcc 与 clang 的代码编译错误提示对比,结论是,clang这个晚辈确实比gcc人性化多了。

参考:

http://www.cnblogs.com/Fancyboy2004/archive/2008/12/23/1360810.html

以下是测试代码:

 

 

#include <cstdlib>

class Apple
{
    public:
        Apple (){};     /* constructor */

        int GetCount()  /* 非const 成员函数 */
        {
            return m_iData;
        };
    protected:
        int m_iData;
}; /* -----  end of class Apple  ----- */

using namespace std;


int main ( int argc, char *argv[] )
{
    const Apple apple;
    apple.GetCount();    /* 错误 */

	return EXIT_SUCCESS;
}		// ----------  end of function main  ---------- 
//save to a.cc
 

 

 

 

gcc编译命令:

$ g++ a.cc
a.cc: In function ‘int main(int, char**)’:
a.cc:22: error: passing ‘const Apple’ as ‘this’ argument of ‘int Apple::GetCount()’ discards qualifiers

 

clang:

$ clang++ a.cc
a.cc:22:5: error: member function 'GetCount' not viable: 'this' argument has
      type 'const Apple', but function is not marked const
    apple.GetCount();    /* 错误 */
    ^~~~~
a.cc:8:13: note: 'GetCount' declared here
        int GetCount()  /* 非const 成员函数 */
            ^
1 error generated.
 

 

### 编译器功能对比 #### 基本概述 GCC(GNU Compiler Collection)是一个历史悠久的编译器集合,最初由Richard Stallman创建于1987年。它不仅支持C和C++,还涵盖了多种编程语言[^1]。相比之下,Clang是LLVM项目的一部分,诞生于2005年,专注于提供更友好的用户体验以及更快的开发周期[^3]。 #### 背景与历史 GCC起源于自由软件运动,旨在为开发者提供一个完全开源且不受专利限制的工具链解决方案。而Clang则是在苹果公司推动下发展起来的新一代编译前端技术,其设计目标之一就是改善传统GCC在诊断信息方面的不足之处。 #### 架构与模块化 从内部结构来看,GCC采用单体式(monolithic)的设计模式,这使得它的扩展性和维护成本相对较高;相反地,Clang基于LLVM框架构建而成,具备高度可重用的核心组件库(如libclang),从而实现了更好的灵活性与插件能力. #### 错误提示与静态分析 当涉及到代码质量保障时,两者都提供了强大的静态检查机制来帮助发现潜在缺陷.然而值得注意的是,由于设计理念的不同,Clang往往能够给出更加清晰易懂的报错消息并附带修复建议,这对于初学者或者跨团队协作来说尤为重要[^2].此外,借助丰富的API接口,还可以轻松集成第三方插件进一步增强安全性检测效果. #### 性能与编译速度 就执行效率而言,在某些特定条件下Clang可能展现出优于GCC的表现趋势,尤其是在增量构建过程中表现尤为明显。这是因为Clang采用了更为激进优化策略的同时保持较低内存占用率的缘故。不过具体到实际应用当中,则需视项目规模复杂度等因素综合考量才能得出结论。 #### 兼容性与多平台支持 尽管二者均声称遵循ANSI/ISO标准规范编写程序代码,但在处理一些边缘情况或是非标准化特性实现上仍存在一定差异。例如对于嵌入式系统领域内的资源受限环境下的移植工作,通常推荐优先考虑使用GCC完成相应任务;而对于桌面级应用程序或者是移动终端设备上的图形界面渲染引擎等方面的需求,则可以更多倾向于选择Clang来进行操作。 #### 调试支持 无论是GDB还是LLDB都可以很好地配合各自的同源产品一起发挥作用。但是考虑到社区活跃程度和技术更新频率方面的原因,目前围绕着后者所展开的相关讨论数量正在逐步增加之中。 ```bash # 使用GCC编译示例 gcc -o test_program test.c # 使用Clang编译相同文件 clang -o test_program test.c ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值