我收到了一大堆关于开关的警告,这些开关只覆盖了所切换的枚举的部分范围。因此,我希望所有这些开关都有一个“默认值”,并在这种情况下放入__builtin_unreachable
(GCC内置),这样编译器就知道这种情况是不可访问的。
然而,我开始了解到GCC4.3还不支持该内置。有没有什么好的方法来模拟这个功能呢?我想过取消引用空指针,但这可能会产生其他不良的影响/警告等等。你还有更好的主意吗?
发布于 2014-03-16 00:54:06
您可以调用一个声明为_Noreturn
的内联函数,将该调用之后的任何内容标记为不可达。编译器被允许在这样的函数之后抛出任何代码。如果函数本身是static
(并且确实返回),编译器通常也会内联该函数。下面是一个示例:
static _Noreturn void unreachable() {
return; /* intentional */
}
/* ... */
foo();
bar(); /* should better not return */
unreachable();
baz(); /* compiler will know this is not reachable */
请注意,如果标记为_Noreturn
的函数确实返回,则会调用未定义的行为。确保所述函数永远不会被调用。
发布于 2011-05-17 22:15:34
abort
(留下核心转储)或throw
(允许备用数据捕获)能满足您的需求吗?
您真的希望switch语句不包含完整的枚举吗?我几乎总是尝试在没有默认情况的情况下列出所有可能的情况( no-op),这样如果添加了新的枚举,gcc就会警告我,因为它可能需要处理它们,而不是让它静默地(在编译期间)落入默认情况。
发布于 2011-05-17 22:19:04
保持简单:
assert(false);
或者,更好的是:
#define UNREACHABLE (!"Unreachable code executed!")
assert(UNREACHABLE);
https://stackoverflow.com/questions/6031819
复制相似问题