首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模仿GCC的__builtin_unreachable?

模仿GCC的__builtin_unreachable?
EN

Stack Overflow用户
提问于 2011-05-17 21:52:41
回答 4查看 12.2K关注 0票数 26

我收到了一大堆关于开关的警告,这些开关只覆盖了所切换的枚举的部分范围。因此,我希望所有这些开关都有一个“默认值”,并在这种情况下放入__builtin_unreachable (GCC内置),这样编译器就知道这种情况是不可访问的。

然而,我开始了解到GCC4.3还不支持该内置。有没有什么好的方法来模拟这个功能呢?我想过取消引用空指针,但这可能会产生其他不良的影响/警告等等。你还有更好的主意吗?

EN

回答 4

Stack Overflow用户

发布于 2014-03-16 00:54:06

您可以调用一个声明为_Noreturn的内联函数,将该调用之后的任何内容标记为不可达。编译器被允许在这样的函数之后抛出任何代码。如果函数本身是static (并且确实返回),编译器通常也会内联该函数。下面是一个示例:

代码语言:javascript
复制
static _Noreturn void unreachable() {
    return; /* intentional */
}

/* ... */

foo();
bar(); /* should better not return */
unreachable();
baz(); /* compiler will know this is not reachable */

请注意,如果标记为_Noreturn的函数确实返回,则会调用未定义的行为。确保所述函数永远不会被调用。

票数 12
EN

Stack Overflow用户

发布于 2011-05-17 22:15:34

abort (留下核心转储)或throw (允许备用数据捕获)能满足您的需求吗?

您真的希望switch语句不包含完整的枚举吗?我几乎总是尝试在没有默认情况的情况下列出所有可能的情况( no-op),这样如果添加了新的枚举,gcc就会警告我,因为它可能需要处理它们,而不是让它静默地(在编译期间)落入默认情况。

票数 4
EN

Stack Overflow用户

发布于 2011-05-17 22:19:04

保持简单:

代码语言:javascript
复制
assert(false);

或者,更好的是:

代码语言:javascript
复制
#define UNREACHABLE (!"Unreachable code executed!")

assert(UNREACHABLE);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6031819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档