控制Clang警告

11

我已经将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个回答

16
任何较新版本的clang都应该在警告信息中打印与给定警告相关联的标记(在本例中为-Wconstant-conversion),不确定为什么您没有看到这个标记。要关闭它,您可以使用#pragma clang diagnostic ignored "-Wconstant-conversion"

你在哪里看到了 constant-conversion?Xcode除了警告文本以外没有显示给我任何东西。 - user187676
哦... Xcode对clang的输出进行了许多操作;我不确定它具体做了什么。 - servn
2
在Xcode中,您可以通过查看>导航器>显示日志导航器来查看实际的构建输出。选择需要更多信息的警告或错误,并单击该行右侧的“行”图标以查看输出(包括类似于warning: something something [-Wreason-why]的内容)。 - jemmons
6
请注意,如果您想重新启用此检查(您应该这样做),您可以使用 #pragma clang diagnostic push#pragma clang diagnostic pop 进行包装。 - jemmons

1

引用Chris Lattner先生编写的用户手册:

在下面的示例中,-Wmultichar仅对单行代码忽略,之后诊断将返回到之前存在的任何状态。

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

但更重要的是,考虑一下“mask”是什么类型以及它代表了什么,这样做会不会更加谨慎呢?

既然你正在根据long的大小做某些事情,那么它的类型应该是uint64_t吗?

如果sizeof(long)实际上是16而不是8或4(我猜当它不是8时你期望它是4),那么0x7fffffff仍然是你需要的掩码吗?或者也许你真正想从limits.h中分配它的LONG_MAX而不是当前的构造。


OP明确表示他不想改变SQLite的源代码。 - bdesham

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接