如何查看编译器提示存在非标准代码?如何知道当前编译器默认C/C++标准是多少?GCC有提供命令查看编译器基本配置吗?编译警告和错误?Clang也兼容MSVC?编译器如何把warning当做error?

目录

如何查看编译器提示存在非标准代码?

如何知道当前编译器默认C/C++标准是多少?

GCC有提供命令查看编译器基本配置吗?

编译警告和错误

不同语言的编译警告

禁用编译警告

提示警告或错误

编译行号

Clang也兼容MSVC?

编译器如何把warning当做error?


如何查看编译器提示存在非标准代码?

GCC提供-pedantic选项可以在发现非标准C/C++代码时,显示警告信息。
The -pedantic option directs GCC to print a warning message if any of these features is used.

  • 比如使用case范围匹配:
    警告:在 switch 语句中使用范围表达式不符合标准 [-Wpedantic]

如何知道当前编译器默认C/C++标准是多少?

GCC

  • 参考gcc官方网站和发行说明信息,搜索”default for C code“或”default for C++ code“.
  • man gcc搜索"default for C code"或"default for C++ code".
  • 利用-dM -E参数获取
    g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
    - g++ 11.4.0输出的结果#define __cplusplus 201703L,代表默认C++17.
    gcc -dM -E -x c /dev/null | grep -F STDC_VERSION
    - gcc 11.4.0输出的结果define STDC_VERSION 201710L,即代表默认C17.
    - 也可加入-std=xxx选项来检测:gcc -dM -E -x c -std=c11 /dev/null | grep -F STDC_VERSION会得到201112L.

代码中,可以用__STDC_VERSION__宏(C99之前不支持)和__cplusplus宏判断编译器支持的C标准和C++标准版本。

  • C99标准的值为199901L,C11标准的值为201112L,C17标准的值为201710L.
  • C++98标准的值为199711L,C++11标准的值为201103L,C++14标准的值为201402L,C++17标准的值为201703L,C++20标准的值为202002L.

如何获取预处理器定义了哪些宏?

GCC有提供命令查看编译器基本配置吗?

有的时候,我们想知道编译器默认是什么配置,比如是默认32位或者64位。GCC有提供-dumpspecs选项可以一窥究竟。

gcc -dumpspecs 命令,用于输出 GCC 的内部规格说明(specifications). 它们包括了GCC 在编译程序时使用的默认设置和选项,以及它如何处理不同的源文件和目标文件,对于了解GCC内部机制、处理编译和调试的问题、调优有很大帮助。如下截取了默认架构的设定(默认64位,同时可支持32位):

*multilib_defaults:
m64

*multilib_extra:

*multilib_matches:
m32 m32;m64 m64;mx32 mx32;

编译警告和错误

有时警告是没用的,普京说,多少次警告都不如飞机翅膀振几次。

不同语言的编译警告

  • C语言可使用-Wall打开所有警告,也可以将某些或所有警告设置为error.

禁用编译警告

  • MSVC提供#pragma 预处理禁止warning的方式,例如禁止输出警告代号3088:
    #pragma warning(disable: 3088)
  • C# 提供 #pragma warning disable <warn_no> 禁用特定编译警告,#pragma warning restore <warn_no> 恢复编译警告。也提供编译选项中 /nowarn:warn0,warn1,... 禁用warning list.

提示警告或错误

  • C/ObjC/C++/C# 提供#warning和#error显式提示编译器此处有warning和error.

编译行号

  • C/ObjC/C++/C# 提供 #line 强制编译器认为当前的行号。
  • C# 还提供 #line default 恢复编译器源代码真实的行号。

Clang也兼容MSVC?

没错,Clang设计目标是GCC & MSVC compatibility,Windows版本的Clang编译器,默认clang.exe是兼容GCC选项,clang-cl.exe是兼容MSVC编译选项。

编译器如何把warning当做error?

  • GCC/Clang编译C/ObjC,仅仅用-Werror选项并不能将所有warning都当做error,有些warning默认就没开启。比如-Wuninitialized. 需要二者都开启,才会生效。
    gcc -Werror -Wuninitialized xxx.c


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

1.您还可以访问 迷软科技 网站:https://www.minicoda.com

2.想学习更多知识,您可以关注 微信公众号程序员小迷miniminicode )(一个关注于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift等语言软件开发技能技巧经验的公众号)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值