使用代码调整删除“比较始终为假”警告

时间:2018-02-21 18:04:22

标签: 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-reserved pragma,因为我的代码必须同时使用g ++和clang ++。

我想过类似的事情:

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

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

2 个答案:

答案 0 :(得分:0)

我在撰写这篇文章时考虑过的解决方案是将unsigned int替换为int,并在需要时在for循环中使用static_cast<unsigned int>(i)。但是我写这篇文章只是为了删除它。 无论如何,欢迎任何更优雅的解决方案!

答案 1 :(得分:0)

在c ++ 17中,您可以使用if constexpr

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

在您使用专业化之前

template <std::size_t M>
void bar(/*...*/) {
    for(unsigned int i = 0; i < M; i++) { ... }
}

template <>
void bar<0>(/*...*/) {
    /* Empty */
}