C++ 删除“;比较总是错误的;使用代码调整的警告 用G+或CLAN+++)。

C++ 删除“;比较总是错误的;使用代码调整的警告 用G+或CLAN+++)。,c++,compilation,g++,compiler-warnings,clang++,C++,Compilation,G++,Compiler Warnings,Clang++,我有一个模板类a: template<int N> class A { ... }; 在这个for循环声明中,M是从编译时解析的N计算出来的(编译解析常数的乘法) 对于N的某些值,在某些情况下,For循环等效于: for(unsigned int i = 0; i < 0; i++) { ... } for(无符号整数i=0;i

我有一个模板类a:

template<int N> class A { ... };
在这个for循环声明中,
M
是从编译时解析的
N
计算出来的(编译解析常数的乘法)

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

for(unsigned int i = 0; i < 0; i++) { ... }
for(无符号整数i=0;i<0;i++){…}
但这是故意的,我只希望优化器删除循环

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

error: comparison of unsigned expression < 0 is always false [-Werror,-Wtautological-compare]
错误:无符号表达式<0的比较始终为false[-Werror,-Wtautological compare]
这是显而易见的,也是正确的

我的问题是:

是否有某种调整可以通过不考虑for循环来丢弃此警告?我说的是一个Twitter,它意味着纯C++代码,没有CLAN保留的语法,因为我的代码必须同时使用G++和CLAN+++。 我曾经想过这样的事情:

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

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

我在写这篇文章时考虑的一个解决方案是用
int
替换
unsigned int
,如果需要,在for循环中使用
static\u cast(I)
。但我花了太长的时间才把它删掉。
无论如何,我们欢迎任何更优雅的解决方案

在c++17中,如果constexpr
,则可以使用

if constexpr (M > 0) {
    for(unsigned int i = 0; i < M; i++) { ... }
}
if constexpr(M>0){
对于(无符号整数i=0;i
在你可能使用专业化之前

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

template <>
void bar<0>(/*...*/) {
    /* Empty */
}
模板
空心条(/*…*/){
对于(无符号整数i=0;i
“flag-Werr with g++或-Werror with clang++”-无需将它们区分开来
-Werror
适用于这两种编译器。GCC和clang都有pragmas来临时禁用某段代码的警告。如果没有生成警告,那么也不会有错误。至于要禁用哪个警告,它在错误消息中。Unsigned不能小于零,因此编译器可以就此向您发出警告。检查unsigned是否可以小于
0
,这太过分了。关于(unsigned int i=0;(i+1)<(M+1);i++)呢?当然不是一个非常优化的解决方案!为什么需要
无符号
int?让它签名,错误就会消失。
template <std::size_t M>
void bar(/*...*/) {
    for(unsigned int i = 0; i < M; i++) { ... }
}

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