相关疑难解决方法(0)

模仿GCC的__builtin_unreachable?

我得到了很多关于交换机的警告,这些交换机仅部分覆盖了切换的枚举范围.为此,我想有一个"默认"所有这些开关,并将__builtin_unreachable(GCC内置),在这种情况下,让编译器知道这种情况是不可达.

但是,我才知道GCC4.3还不支持内置版.有没有什么好方法可以模仿这个功能?我考虑过取消引用空指针,但这可能有其他不良影响/警告等.你有更好的主意吗?

c++ gcc unreachable-code

23
推荐指数
2
解决办法
8048
查看次数

超出范围的枚举转换是否可以产生基础类型之外的值?

考虑以下:

#include <iostream>

enum class E : bool { A, B };

void foo(E e)
{
    switch(e)
    {
    case E::A: break;
    case E::B: break;
    default: std::cout << "aha\n";
    }
}

int main()
{
    foo( static_cast<E>(3) );
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否可以default触发案例,即该程序是否产生输出?

N3936中的棘手问题似乎是static_cast将超出范围的整数转换为枚举类型[expr.static.cast]/10时的规范:

可以将整数或枚举类型的值显式转换为枚举类型.如果原始值在枚举值的范围内,则该值不变.否则,结果值未指定(可能不在该范围内).

粗体文本没有明确说明该值必须仍然在基础类型的范围内,但我想知道它是否打算这样做.

c++ language-lawyer c++14

15
推荐指数
1
解决办法
4420
查看次数

检测是否将int转换为枚举结果为非枚举值

假设我有这样的事情:

enum CardColor { HEARTS, DIAMONDS, CLUBS, SPADES};

CardColor MyColor = static_cast<CardColor>(100);
Run Code Online (Sandbox Code Playgroud)

是否有(简单)方法在编译时或运行时检测到值MyColor与任何枚举值不对应?

更一般地说,如果枚举值不相互跟随,例如:

enum CardColor { HEARTS = 0, DIAMONDS, CLUBS = 4, SPADES};
Run Code Online (Sandbox Code Playgroud)

c++ enums

12
推荐指数
3
解决办法
1万
查看次数

标签 统计

c++ ×3

c++14 ×1

enums ×1

gcc ×1

language-lawyer ×1

unreachable-code ×1