How to do an explicit fall-through in C

12,906

Solution 1

Use __attribute__ ((fallthrough))

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

Solution 2

GCC fallghrough magic comments

You should not use this if you can help it, it is insane, but good to know about:

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

prevents the warning on GCC 7.4.0 with:

gcc -Wall -Wextra main.c

man gcc describes how different comments may or not be recognized depending on the value of:

-Wimplicit-fallthrough=n

C++17 [[fallthrough]] attribute

C++17 got a standardized syntax for this: GCC 7, -Wimplicit-fallthrough warnings, and portable way to clear them?

Solution 3

You should be able to use GCC diagnostic pragmas to disable that particular warning for your source file or some portion of a source file. Try putting this at the top of your file:

#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
Share:
12,906

Related videos on Youtube

dlasalle
Author by

dlasalle

Software development consultant at Solid Lake, specializing in high-performance computing. Find my projects on GitHub.

Updated on June 05, 2022

Comments

  • dlasalle
    dlasalle about 2 years

    The newer versions of gcc offer the Wimplicit-fallthrough, which is great to have for most switch statements. However, I have one switch statement where I want to allow fall throughs from all case-statements.

    Is there a way to do an explicit fall through? I'd prefer to avoid having to compile with Wno-implicit-fallthrough for this file.

    EDIT: I'm looking for a way to make the fall through explicit (if it's possible), not to turn off the warning via a compiler switch or pragma.

    • paddy
      paddy about 7 years
      Perhaps this is what you want.
    • Retired Ninja
      Retired Ninja about 7 years
    • Jonathan Leffler
      Jonathan Leffler about 7 years
      Check out the description at -Wimplicit-fallthrough in the GCC documentation? There won't be any non-extension mechanism — the whole issue is all extension.
  • lwho
    lwho almost 6 years
    Also note that the above is gcc-specific. For C++ there is also a standardized way to write it since C++17: [[fallthrough]];
  • Rahul Sreeram
    Rahul Sreeram about 4 years
    Thanks for the magic comments. It actually worked.My code needs to be backward compatible with c++03 also and __attribute__ ((fallthrough)) didnt work. The comments worked like magic :)
  • Zhou Hongbo
    Zhou Hongbo about 2 years
    Thanks!! Only this answer works on android jni.