对于微软,这点上,没什么好感,
~ $ g++-7 -Wall no-namespace.cppno-namespace.cpp: In function 'int main()':no-namespace.cpp:4:5: error: 'cout' was not declared in this scopecout << "Hello, world!n"; // should be std::cout^~~~no-namespace.cpp:4:5: note: suggested alternative:In file included from no-namespace.cpp:1:0:/usr/include/c++/7.3.0/iostream:61:18: note:'std::cout'extern ostream cout;/// Linked to standard output^~~~这个看上去好些, 虽然返回的消息有点迷,但是GCC能够搞清楚我们指的是std::cout 。再看看clang 。
~ $ clang++-6.0 -Wall no-namespace.cppno-namespace.cpp:4:5: error: use of undeclared identifier 'cout'; did you mean 'std::cout'?cout << "Hello, world!n"; // should be std::cout^~~~std::cout/usr/include/c++/v1/iostream:54:33: note: 'std::cout' declared hereextern _LIBCPP_FUNC_VIS ostream cout;^1 error generated.好吧,对于clang来说,虽然和GCC显示了相同的信息,但还是和GCC有所区别的,clang能直接的问到点子上“你是否是指std::cout",而后才会去执行,clang两分,GCC得一分.
1-7轮积分情况: Clang: 8,GCC: 4,MSVC: 4
第八轮:dynamic_casting,一个类本身C ++ dynamic_cast应该在指向类的指针上使用,而不是在类本身上使用,这是蛮奇怪的 。
【技术分享——gcc、clang、msvc等编译器的区别】casting-a-class.cpp
class Base {};class Derived : public Base {};int main() {Base base;Derived derived = dynamic_cast<Derived>(base); // should be used on a pointerreturn 0;}
~ $ clang++-6.0 -Wall casting-a-class.cppcasting-a-class.cpp:6:23: error: 'Derived' is not a reference or pointerDerived derived = dynamic_cast<Derived>(base); // should be a pointer^~~~~~~~~~1 error generated.天呐,这块clang竟然报错,
~ $ g++-7 -Wall casting-a-class.cppcasting-a-class.cpp: In function 'int main()':casting-a-class.cpp:6:49: error: cannot dynamic_cast 'base' (of type 'class Base') to type 'class Derived' (target is not pointer or reference)Derived derived = dynamic_cast<Derived>(base); // should be a pointer^这点上看,GCC更清晰一些,虽然我不知道它指向的是什么 。
C:> cl /W3 /diagnostics:caret casting-a-class.cppcasting-a-class.cpp(6,49): error C2680: 'Derived': invalid target type for dynamic_castDerived derived = dynamic_cast<Derived>(base); // should be used on a pointer^casting-a-class.cpp(6,49): note: target type must be a pointer or reference to a defined classDerived derived = dynamic_cast<Derived>(base); // should be used on a pointer^Microsoft (R) C/C++ Optimizing Compiler Version 19.10.25017 for x86Copyright (C) Microsoft Corporation.All rights reserved.MSVC在上面这里胜出 。虽然我感觉它有指向性的错误,但至少把这个问题正确报答出来了 。
8轮下来总积分:Clang: 8,GCC: 5,MSVC: 6
特别补充说明,前面完全没有要说其中哪个很差劲,三者无疑各有优缺点, 但是,仅就诊断功能上来说clang被证明更强大些 。
文章来源:
https://easyaspi314.github.io/gcc-vs-clang.html
推荐阅读
- 怎么开发直播APP?资深技术划重点了
- 茶菊花种植技术和收入,恩施玉露茶的简介
- 人心果修剪技术视频 人心果什么时候成熟
- 上篇 一套亿级用户的IM架构技术干货:整体架构、服务拆分等
- 2022新春对联大全七字创意?七字春联大全 对联2022
- 金丝皇菊种植技术,金丝皇菊什么样的好金丝皇菊和胎菊哪个好你了解吗
- 互联网云服务器JVM监控——JDK自带工具
- Linux服务器集群系统——LVS集群中的IP负载均衡技术
- 深入底层探究并发编程Bug罪魁祸首——可见性、原子性、有序性
- Clickhouse 在快手的架构和技术内幕
