C++ 删除“;比较总是错误的;使用代码调整的警告 用G+或CLAN+++)。
我有一个模板类a: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
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 */
}