Search code examples
cgccgcc-extensions

What is "..." in switch-case in C code


Here is a piece of code in /usr/src/linux-3.10.10-1-ARCH/include/linux/printk.h:

static inline int printk_get_level(const char *buffer)
{
  if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
    switch (buffer[1]) {
    case '0' ... '7':
    case 'd':  /* KERN_DEFAULT */
      return buffer[1];
    }
  }
}

Is it a kind of operator? Why does "The C Programming Language" not mention it?


Solution

  • This is a gcc extension called case ranges, this is how it is explained in the document:

    You can specify a range of consecutive values in a single case label, like this:

    case low ... high:
    

    You can find a complete list of gcc extensions here. It seems like clang also supports this to try and stay compatible with gcc. Using the -pedantic flag in either gcc or clang will warn you that this is non-standard, for example:

    warning: range expressions in switch statements are non-standard [-Wpedantic]
    

    It is interesting to note that Linux kernel uses a lot of gcc extensions one of the extensions not covered in the article is statement expressions.