我在 Linux 上安装了英特尔编译器 composer_xe_2013_sp1.3.174。我对 icc 警告感到困惑。用一个简单的程序 main.c 喂 icc,如下所示:
int main(int argc, char **argv) {
int a = 1;
unsigned int b = -22;
if (b = a) {
}
}
我使用以下命令编译文件:icc -Wall main.c
。令人惊讶的是,该命令在没有任何警告的情况下静默运行。我必须打开 icc 上的警告开关吗?谢谢
最佳答案
Intel 编译器并没有像 gcc 那样有很好的警告预设(至少在 Linux 上是这样)。主要的警告选项是-wn
,其中n可以是0到5。默认是1,4&5在Linux上没有意义。它还支持一些 gcc 选项,如 -Wall
和 -Wextra
。然而:
-Wall
与 gcc 相比非常简约,如您所见-w2
和-w3
启用一些有用的诊断,但也有很多垃圾评论-diag-disable:remark
删除了垃圾邮件,但也删除了很多有用的诊断信息
最后 -w3 -diag-disable:remark
是 icc 拥有的最好的预设,但它仍然比 gcc -Wall
更简约。相反,您需要从最少的一组警告开始并建立自己的警告,或者从最多的诊断开始并使用 -wd
禁用任何烦人的警告。
建立
第一种方法的主要缺点是英特尔并没有真正记录其大部分警告,因此很难知道可以启用哪些内容。但是,它确实支持许多 GCC 命令行标志,因此 GCC 文档是一个很好的起点。例如,这里有一些相对接近于 g++ -Wall
的设置,如果你想用其中一个进行开发并很有可能用另一个进行干净构建,这很方便:
icpc -Wall -Warray-bounds -Wchar-subscripts -Wcomment -Wenum-compare -Wformat -Wuninitialized -Wmaybe-uninitialized -Wmain -Wnarrowing -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type -Wsign-compare -Wsequence-point -Wtrigraphs -Wunused-function -Wunused-but-set-variable -Wunused-variable -Wwrite-strings
这与 gcc -Wall
不完全匹配。 GCC 和 ICC 对上述警告的实现存在差异。我也找不到与这些 GCC 警告匹配的 ICC 选项:
-Wformat-contains-nul
-Wunused-label
-Wstrict-overflow
-Wvolatile-register-var
我有意将这些排除在外,因为 ICC 版本比 GCC 垃圾邮件多得多:
-Wstrict-aliasing So broad that any use of polymophism will cause this warning
-Wswitch Requires a default even if you have cases for all enumeration values
修剪
如果 GCC 奇偶校验不是问题,那么了解 ICC 有哪些警告的最简单方法是启用它们,然后决定您是否喜欢它们。如果您不喜欢警告,您可以使用它的诊断编号禁用它,这通常比 GCC 的选项具有更多的粒度。
icpc -w3 -wd1418,2259
以下是我过去看到的一些被禁用的诊断:
- 383:值复制到临时,引用临时使用
- 869: 从未引用参数“*”
- 981:操作数以未指定的顺序求值
- 1418: 没有预先声明的外部函数定义
- 1572:浮点相等和不等比较不可靠
- 2259:非指针转换可能会丢失重要位
- 11074:限制最大尺寸(或最大总尺寸)禁止内联
- 11076:要获得完整报告,请使用 -qopt-report=4 -qopt-report-phase ipo
- 161: 禁用对无法识别的编译指示的警告
但我鼓励您从所有这些开始,只减少对您的代码库有问题的那些。
关于c++ - 如何打开 icc/icpc 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343360/