49 votes

Qu'est-ce que "..." dans un boîtier en code C?

Voici un morceau de code en /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];
    }
  }
}
 

Est-ce une sorte d'opérateur? Pourquoi "Le langage de programmation C" n'en parle-t-il pas?

62voto

Shafik Yaghmour Points 42198

C'est un gcc extension de cas, des plages, c'est la façon dont c'est expliqué dans le document:

Vous pouvez spécifier une plage de valeurs consécutives dans un seul cas, l'étiquette, comme ceci:

case low ... high:

Vous pouvez trouver une liste complète des extensions de gcc ici. Il semble que clang prend également en charge ce pour essayer de rester compatible avec gcc. À l'aide de l' -pedantic drapeau soit en gcc ou clang vous avertir que c'est non standard, par exemple:

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

Il est intéressant de noter que le noyau Linux utilise beaucoup de gcc extensions de l'une des extensions ne sont pas couverts dans l'article est la déclaration des expressions.

12voto

Vladimir Points 110327

C'est une extension du compilateur gcc permettant de combiner plusieurs instructions case dans une ligne.

10voto

Bathsheba Points 23209

Attention, ce n'est pas standard C et donc pas portable. C'est un raccourci conçu pour les déclarations de cas. C'est bien défini car en C, vous ne pouvez activer que les types intégraux.

En C standard, ... n'est utilisé que dans les listes d'arguments de longueur variable.

6voto

Gangadhar Points 5474

case '0' ... '7': est la plage de cas Speciacation en gcc.

Spécification de plage pour l'instruction case.

Ecrivez des espaces autour du ..., sinon il risque d'être mal analysé lorsque vous l'utilisez avec des valeurs entières

 case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1]; 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X