c++ - 使用代码调整删除 "comparison is always false"警告

标签 c++ compilation g++ compiler-warnings clang++

我正在从事一个巨大的 C++ 项目,为了让事情变得非常干净,所有警告都被故意变成了错误(用 g++ 或 clang++ 标记 -Werror)。

我有一个模板类 A:

template<int N> class A { ... };

根据 N 的值,一些一般行为会有所不同。在 A 的方法之一中,我有一个 for 循环:

for(int i = 0; i < M; i++) { ... }

在这个 for 循环声明中,M 是根据 N 计算的,它在编译时解析(编译解析常量的乘法)。

对于 N 的某些值,在某些情况下 for 循环等同于:

for(unsigned int i = 0; i < 0; i++) { ... }

但这是故意的,我只是想让优化器删除循环。

有了g++,就没有问题了。但是,使用 clang++,我得到:

error: comparison of unsigned expression < 0 is always false [-Werror,-Wtautological-compare]

这是显而易见且正确的。

我的问题是:

是否有某种调整可以通过不考虑 for 循环来丢弃此警告?我说的是一个暗示纯 C++ 代码和没有 clang 保留编译指示的调整,因为我的代码必须与 g++ 和 clang++ 一起工作。

我想过类似的事情:

if(M > 0) for(unsigned int i = 0; i < M; i++) { ... }

但这只是给出了同样的错误。有什么想法吗?

最佳答案

我在写这篇文章时想到的一个解决方案是替换 unsigned int通过 int并使用 static_cast<unsigned int>(i)如果需要,在 for 循环内。但是我写的时间太长了,只是为了删除它。 无论如何,欢迎任何更优雅的解决方案!

关于c++ - 使用代码调整删除 "comparison is always false"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48912627/

相关文章:

c++ - 是否有可以无限期编译的 C++ 代码?

将源代码从 ARMv5 编译到 ARMv6

c++ - 用 Big-O Notation 计算我的程序的算法复杂度

c++ - 使用 g++ 编译,使用 vector 和数组库

c++ - 整数常量太大以至于在将最大类型值分配给枚举时它是无符号的

c++ - 在 Windows 上使用 GCC 的链接时间优化构建 wxWidgets DLL 时出错

c++ - Gcc 检查给定的类是否有operator+

c++ - 在 Ubuntu 的 PATH 中找不到程序 "g++"

c++ - 为什么在 for 循环中没有初始化的声明没有任何警告?

c++ - 动态内存分配并接受输入