我正在从事一个巨大的 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/