我想在复杂系统中使用代码部分,它与以下内容相同:
static constexpr int abits = 13;
static constexpr int bbits = 10;
...
int atob(int a) {
if ( abits == bbits ) return a;
else if ( abits > bbits ) return a >> (abits-bbits);
else return a << (bbits-abits);
}
abits
和bbits
可能会随着时间而改变(当然是在编译时)。即使在调试模式下,最终代码中始终只编译一行。但是,我收到一个关于转移负值的警告信息。
我使用GCC 7.3.0,并且不想避免负移位值上的所有警告。我想摆脱没有使用的代码的警告。但是,我没有找到它的开关。
答案 0 :(得分:6)
如果您的条件是constexpr
,则可以在编译时使用constexpr if
进行分支。
static constexpr int abits = 13;
static constexpr int bbits = 10;
int atob(int a) {
if constexpr ( abits == bbits ) return a;
else if constexpr ( abits > bbits ) return a >> (abits-bbits);
else return a << (bbits-abits);
}
constexpr if
是一个c ++ 17功能,可在gcc 7.3.0上使用-std=c++17
标志。
编辑:c ++ 14解决方案可以使用std::enable_if
。诀窍是为这三种情况提供过载,并且只启用适用的情况。
static constexpr int abits = 13;
static constexpr int bbits = 10;
#include <type_traits>
template<int I>
std::enable_if_t<I == 0, int>
atob_impl(int a) {
return a;
}
template<int I>
std::enable_if_t<(I > 0), int>
atob_impl(int a) {
return a >> (abits-bbits);
}
template<int I>
std::enable_if_t<(I < 0), int>
atob_impl(int a) {
return a << (bbits-abits);
}
int atob(int a) {
return atob_impl<abits - bbits>(a);
}
答案 1 :(得分:2)
由于您使用的是支持带有-std=c++17
的C ++ 17的GCC 7.3.0,因此您可以使用if constexpr
来隐藏此警告:
int atob(int a) {
if constexpr ( abits == bbits ) return a;
else if constexpr ( abits > bbits ) return a >> (abits-bbits);
else return a << (bbits-abits);
}
通常,通常有一种方法可以抑制代码中的警告(即,没有#pragma
来禁用警告)。 (void)variable;
可以禁止未使用的变量警告,可以通过添加额外的parens(if
)等来抑制if ((thing = value))
中的分配。
在这种情况下,您可以使用std::max
else return a << std::max(0, bbits-abits);
由于bbits
和abits
是constexpr
,编译器将对std::max
调用执行常量折叠并生成直接结果(假设使用优化编译)。
答案 2 :(得分:1)
我认为经典的C解决方案对C ++不满意,但它存在:你可以使用
{{1}}