我已将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
“文档”中找不到任何内容。
答案 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/
的侧边栏中还有其他有用的文档