Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 769
jasonz Avatar asked Sep 17 '13 15:09

jasonz


People also ask

What is a switch case in C?

A switch statement allows a variable to be tested for equality against a list of values. Each value is called a case, and the variable being switched on is checked for each switch case.

What is this switch case?

Table of Contents. The switch statement or switch case in java is a multi-way branch statement. Based on the value of the expression given, different parts of code can be executed quickly. The given expression can be of a primitive data type such as int, char, short, byte, and char.

What is the syntax of switch case?

The syntax of the switch statement is: statement(s); break; case constant 2: statement(s);


3 Answers

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.

like image 104
Shafik Yaghmour Avatar answered Oct 05 '22 17:10

Shafik Yaghmour


It is gcc compiler extension allowing to combine several case statement in one line.

like image 22
Vladimir Avatar answered Oct 05 '22 15:10

Vladimir


Beware, it is not standard C and therefore not portable. It is a shorthand devised for case statements. It's well-defined since in C you can only switch on integral types.

In standard C, ... is only used in variable length argument lists.

like image 37
Bathsheba Avatar answered Oct 05 '22 16:10

Bathsheba