控制Clang警告

时间:2011-09-18 10:06:03

标签: llvm clang

我已将SQLite合并源编译到我的iOS项目中,clang会在此行上发出警告

mask = (sizeof(long)==8) ? LARGEST_INT64 : 0x7fffffff;

带有以下警告:

Implicit conversion from 'long long' to 'long' changes value from
9223372036854775807 to -1
[warn_impcast_integer_precision_constant]

我已启用-fdiagnostics-show-name来显示名称(warn_impcast_integer_precision_constant)。

我当然不想更改SQLite源代码中的任何内容,因为我不想引入不可预见的副作用,所以我想为这一行禁用此特定警告。警告当然有效,但无论如何sizeof检查都不会发生。

为了使此过程可以重现其他警告和诊断,是否有方法找出特定警告类并禁用它们一行?不幸的是,我在所谓的clang/llvm“文档”中找不到任何内容。

3 个答案:

答案 0 :(得分:16)

任何远程最新版本的clang应该打印与给定警告相关联的标志以及警告(在这种情况下为-Wconstant-conversion);不知道为什么你没有看到这个。要关闭它,您可以使用#pragma clang diagnostic ignored "-Wconstant-conversion"

答案 1 :(得分:1)

引自Chris Lattner先生的用户手册:

在下面的示例中,只有一行代码会忽略-Wmultichar,之后诊断将返回到先前存在的状态。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
char b = 'df'; // no warning.
#pragma clang diagnostic pop

但更重要的是,考虑'掩码'的变量类型以及'掩码'代表的变量是不是更谨慎?

由于你做的事情取决于long的大小是否为8,它是否应该是uint64_t类型?

如果sizeof(long)实际上是16而不是8或4(我猜你预计它不是8时)怎么办?那么0x7fffffff仍然是你需要的面具吗?或者你真的想从limits.h中分配LONG_MAX而不是当前的构造。

答案 2 :(得分:-1)

clang用户手册在这里: http://clang.llvm.org/docs/UsersManual.html

讨论与诊断相关的各种主题。 http://clang.llvm.org/

的侧边栏中还有其他有用的文档