36 votes

Quel est le but de ces #define dans une énumération?

J'ai trouvé ce code dans les en-têtes de Linux, /usr/include/dirent.h:

 enum   
  {    
    DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN
    DT_FIFO = 1,
# define DT_FIFO    DT_FIFO   
    DT_CHR = 2,
# define DT_CHR     DT_CHR
    DT_DIR = 4,
# define DT_DIR     DT_DIR
    DT_BLK = 6,
# define DT_BLK     DT_BLK
    DT_REG = 8,
# define DT_REG     DT_REG
    DT_LNK = 10,
# define DT_LNK     DT_LNK
    DT_SOCK = 12,
# define DT_SOCK    DT_SOCK   
    DT_WHT = 14
# define DT_WHT     DT_WHT
  };   
 

A quoi sert cette construction? - pourquoi définir quelque chose avec une chaîne identique, qui sera ensuite compilée à la valeur int?

24voto

Luchian Grigore Points 136646

En plus des autres réponses qui sont très bonnes - je les suivrais pour la raison principale - le compilateur peut générer des avertissements ou des erreurs si vous essayez de redéfinir DT_UNKNOWN .

21voto

Sebastiaan Megens Points 2705

À mon avis, un autre code peut ensuite vérifier si une ou plusieurs de ces valeurs enum ont été définies avec #ifdef.

11voto

Cody Gray Points 102261

Mon hypothèse (sans instruction) est que les instructions #define permettent aux tests conditionnels de voir si la constante a été définie.

Par exemple:

 #ifdef DT_UNKNOWN
    // do something
#endif
 

7voto

alexander Points 1296

Je pense que la réponse de Luchian Grigore était correcte.

Code sans définit:

 #include <stdio.h>

// Defined somewhere in headers
#define DT_UNKNOWN 0

enum
{
    DT_UNKNOWN = 0,
    DT_FIFO = 1,
};

int main(int argc, char **argv)
{
    printf("DT_UNKNOWN is %d\n", DT_UNKNOWN);
    return 0;
}
 

La sortie du compilateur ne permet pas de comprendre pourquoi une ligne de code dans enum ne veut pas construire:

 alexander@ubuntu-10:~/tmp$ gcc -Wall ./main.c 
./main.c:7: error: expected identifier before numeric constant
 

Après avoir ajouté de telles définitions:

 #include <stdio.h>

// Defined somewhere in headers
#define DT_UNKNOWN 0

enum
{
    DT_UNKNOWN = 0,
    # define DT_UNKNOWN DT_UNKNOWN
    DT_FIFO = 1,
    # define DT_FIFO    DT_FIFO
};

int main(int argc, char **argv)
{
    printf("DT_UNKNOWN is %d\n", DT_UNKNOWN);
    return 0;
}
 

Le compilateur nous dirait que DT_UNKNOWN est redéfini et un endroit où il est redéfini:

 alexander@ubuntu-10:~/tmp$ gcc -Wall ./main2.c 
./main2.c:7: error: expected identifier before numeric constant
./main2.c:8:1: warning: "DT_UNKNOWN" redefined
./main2.c:3:1: warning: this is the location of the previous definition
 

0voto

J'ai utilisé -E et -dD arguments (et aussi -fdump-tree-all ) dans gcc pour voir la sortie du préprocesseur et rien trouvé d'utile. Donc, je suppose que ce code n’a aucune autre fonctionnalité que celle d’afficher les noms symboliques lors du débogage à l’aide d’un débogueur tel que gdb .

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