C ++避免对未使用的代码部分发出警告

时间:2018-04-27 20:43:12

标签: c++ warnings

我想在复杂系统中使用代码部分,它与以下内容相同:

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);
}

abitsbbits可能会随着时间而改变(当然是在编译时)。即使在调试模式下,最终代码中始终只编译一行。但是,我收到一个关于转移负值的警告信息。

我使用GCC 7.3.0,并且不想避免负移位值上的所有警告。我想摆脱没有使用的代码的警告。但是,我没有找到它的开关。

3 个答案:

答案 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);
}

Demo

通常,通常有一种方法可以抑制代码中的警告(即,没有#pragma来禁用警告)。 (void)variable;可以禁止未使用的变量警告,可以通过添加额外的parens(if)等来抑制if ((thing = value))中的分配。

在这种情况下,您可以使用std::max

来取消警告
else return a << std::max(0, bbits-abits);

由于bbitsabitsconstexpr,编译器将对std::max调用执行常量折叠并生成直接结果(假设使用优化编译)。

Demo

答案 2 :(得分:1)

我认为经典的C解决方案对C ++不满意,但它存在:你可以使用

{{1}}