[c++] C ++ - enum vs. const vs #define



Answers

enum est la constante de compilation avec les informations de débogage sans allocation de stockage.

const est alloué avec un stockage, selon qu'il est optimisé par le compilateur avec une propagation constante.

#define n'a pas d'allocation de stockage.

Question

À la fin de l'article ici: http://www.learncpp.com/cpp-tutorial/45-enumerated-types/ , il mentionne ce qui suit:

Enfin, comme pour les variables constantes, les types énumérés apparaissent dans le débogueur, ce qui les rend plus utiles que les valeurs définies à cet égard .

Comment la phrase en gras ci-dessus est-elle atteinte?

Merci.




Le compilateur stocke les informations enum dans le binaire lorsque le programme est compilé avec certaines options.

Lorsqu'une variable est d'un type enum, un débogueur peut afficher le nom de l'énumération. Ceci est mieux illustré avec un exemple:

enum E {
    ONE_E = 1,
};

int main(void)
{
    enum E e = 1;

    return 0;
}

Si vous compilez cela avec gcc -g vous pouvez essayer ce qui suit dans gdb :

Reading symbols from test...done.
(gdb) b main
Breakpoint 1 at 0x804839a: file test.c, line 8.
(gdb) run
Starting program: test 

Breakpoint 1, main () at test.c:7
7               enum E e = 1;
(gdb) next
9               return 0;
(gdb) print e
$1 = ONE_E
(gdb) 

Si vous utilisiez une définition, vous n'auriez pas un type approprié pour donner e , et vous devriez utiliser un entier. Dans ce cas, le compilateur imprimera 1 au lieu de ONE_E .

L' -g demande à gdb d'ajouter des informations de débogage au fichier binaire. Vous pouvez même voir que c'est là en émettant:

xxd test | grep ONE_E

Je ne pense pas que cela fonctionnera dans toutes les architectures.




Je réponds trop tard mais je sens que je peux ajouter quelque chose - enum vs const vs #define

enum -

  1. Ne nécessite pas de valeurs d'assemblage (si vous voulez simplement avoir des valeurs séquentielles 0, 1, 2 ..) alors que dans le cas de #defines, vous devez gérer manuellement des valeurs qui pourraient provoquer des erreurs humaines dans le passé
  2. Cela fonctionne tout aussi variable que lors du débogage en ligne, la valeur de enum peut être regardée dans la fenêtre de surveillance
  3. Vous pouvez avoir une variable de type enum à laquelle vous pouvez assigner une énumération

    numéros de type typedef {DFAULT, CASE_TRUE, CASE_OTHER,};

    int main (void) {nombre nombre = CASE_TRUE; }

const -

  1. Il est stocké en permanence dans la zone de lecture seule de la mémoire, mais il est possible d'y accéder en utilisant l'adresse qui n'est pas possible dans le cas de #define
    1. Vous avez le type check dans votre main si vous utilisez const plutôt que #define
  2. définit une directive de pré-traitement mais const est un temps de compilation par exemple

    const char * name = "vikas";

Vous pouvez accéder au nom et utiliser son adresse de base pour lire les noms tels que vikas [3] pour lire «a», etc.

#defines - sont des directives de préprocesseur muettes qui font le remplacement textuel




Links