在C语言中如何进行显式的“fall-through”?

31
新版本的gcc提供了Wimplicit-fallthrough,对于大多数switch语句来说非常有用。但是我有一个switch语句,我想允许所有case语句之间的fall-through。
是否有一种明确指定fall through的方法?我希望不必为此文件编译Wno-implicit-fallthrough。
编辑:我正在寻找一种使fall through明确化的方法(如果可能),而不是通过编译器开关或pragma关闭警告。

也许这个链接是你想要的。 - paddy
我找到了相同的问题。https://dev59.com/43A75IYBdhLWcg3wSm64 - Retired Ninja
1
在GCC文档中查看-Wimplicit-fallthrough的描述吗?整个问题都是扩展机制,没有非扩展机制。 - Jonathan Leffler
3个回答

27

使用__attribute__ ((fallthrough))

switch (condition) {
    case 1:
        printf("1 ");
        __attribute__ ((fallthrough));
    case 2:
        printf("2 ");
        __attribute__ ((fallthrough));
    case 3:
        printf("3\n");
        break;
}

14
请注意,以上是针对gcc的特定处理方式。对于C++,自C++17开始也有一种标准化的写法:[[fallthrough]]; - lwho

8

GCC跳转魔法注释

尽可能避免使用这个,它很疯狂,但了解一下还是有好处的:

int main(int argc, char **argv) {
    (void)argv;
    switch (argc) {
        case 0:
            argc = 1;
            // fall through
        case 1:
            argc = 2;
    };
}

通过以下方式,可以防止在GCC 7.4.0上出现警告:

gcc -Wall -Wextra main.c

man gcc 描述了不同的注释方式可能会根据以下值的不同而被识别或者不被识别:

-Wimplicit-fallthrough=n

C++17 [[fallthrough]] 属性

C++17 引入了该属性的标准化语法:GCC 7、-Wimplicit-fallthrough 警告及其可移植方式的清除?


3
感谢您的神奇评论。它确实有效。我的代码需要向后兼容c ++ 03,但__attribute__ ((fallthrough))不起作用。这些注释就像魔法一样起作用 :) - Rahul Sreeram

4
你应该可以使用GCC诊断预处理指令来禁用源文件或某些部分的特定警告。尝试在文件顶部添加以下内容: (GCC诊断预处理指令)
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"

谢谢!只有这个答案适用于Android JNI。 - Zhou Hongbo
2
为了保持代码的整洁,你应该在代码段开头使用诊断推送(diagnostic push),然后添加你的“忽略”语句,在代码段结尾处加上诊断弹出(diagnostic pop)以恢复旧的设置。 - RufusVS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接