46 votes

Je préfère constantes au cours définit?

En C, je préfère constantes au cours définit? J'ai lu beaucoup de code dernièrement, et tous les exemples de faire un usage intensif de la définit.

102voto

AndreyT Points 139512

Non, en général, vous ne devriez pas utiliser const qualifiés objets en C pour créer des noms de constantes. Afin de créer une constante nommée en C, vous devez utiliser des macros (#define) ou les énumérations. En fait, le langage C n'a pas de constantes, dans le sens que vous semblez le laisser entendre. C est très différent de C++ dans ce domaine)

En langage C, les notions de constante et de la constante d'expression sont définies de façon très différente de C++. En C constante signifie une valeur littérale, comme 123. Voici quelques exemples de constantes en C

123
34.58
'x'

Les constantes en C peut être utilisé pour construire des expressions constantes. Cependant, depuis const qualifiés objets de tout type ne sont pas constantes en C, ils ne peuvent pas être utilisés dans des expressions constantes, et, par conséquent, vous ne pouvez pas utiliser const qualifiés objets où des expressions constantes sont nécessaires.

Par exemple, la suite n'est pas une constante

const int C = 123; /* C is not a constant!!! */

et depuis la C n'est pas une constante, il ne peut pas être utilisé pour déclarer un tableau de type dans le fichier portée

typedef int TArray[C]; /* ERROR: constant expression required */

Il ne peut pas être utilisée comme un label

switch (i) {
  case C: ; /* ERROR: constant expression required */
}

Il ne peut pas être utilisés comme bits largeur de champ

struct S {
  int f : C; /* ERROR: constant expression required */
};

Il ne peut pas être utilisé comme un initialiseur pour un objet statique de la durée de stockage

static int i = C; /* ERROR: constant expression required */

Il ne peut pas être utilisé comme un enum initialiseur

enum {
  E = C /* ERROR: constant expression required */
};

j'.e il ne peut pas être utilisée partout où une constante est nécessaire.

Cela peut sembler contre-intuitif, mais c'est la façon dont C la langue est définie.

C'est pourquoi vous voyez ces nombreux #define-s dans le code que vous travaillez avec. Encore une fois, en langage C, const-objet qualifié ont une utilisation très limitée. Ils sont en fait complètement inutile comme des "constantes", c'est pourquoi en langage C, vous êtes obligé d'utiliser #define ou énumérations de déclarer des constantes réelles.

Bien sûr, dans les situations où un const-objet qualifié qui fonctionne pour vous, c'est à dire qu'il fait ce que vous voulez qu'il fasse, il est en effet supérieur aux macros dans beaucoup de façons, car elle est étendue et a tapé. Vous devriez probablement préférer ces objets, le cas échéant, cependant dans le cas général, vous aurez à prendre en compte ci-dessus.

10voto

Les constantes doivent être préférés defines. Il y a plusieurs avantages:

  • Type de sécurité. Alors que C est un faiblement typé languaged, à l'aide d'un define perd tous le type de sécurité, ce qui permettra au compilateur de repérer les problèmes pour vous.

  • La facilité de débogage. Vous pouvez modifier la valeur des constantes à travers le débogueur, tout en defines sont automatiquement modifiés dans le code par le pré-processeur pour la réelle valeur, ce qui signifie que si vous voulez changer la valeur de test ou des fins de débogage, vous avez besoin de re-compiler.

7voto

jbcreix Points 2383

J'ai peut-être été à l'aide de leur trompe, mais, au moins dans gcc, vous ne pouvez pas utiliser des constantes dans l'affaire états.

const int A=12;
switch (argc) {
    case A:
    break;
}

6voto

Lazer Points 15696

Si cette question est spécifique à C, je suppose qu'il est bon de savoir ceci:

#include<stdio.h>
int main() {
    const int CON = 123;
    int* A = &CON;
    (*A)++;
    printf("%d\n", CON);  // 124 in C
}

travaille en C, mais pas en C++

L'une des raisons de l'utilisation d' #define est d'éviter de telles choses à gâcher votre code, spécialement c'est un mélange de C et de C++.

5voto

asveikau Points 16871

Beaucoup de gens ici qui sont en vous donnant "style C++" conseils. Certains disent même que le C++ arguments s'appliquent à C. Que peut-être un juste point de. (Si elle est ou non se sent en quelque sorte subjectif.) Les gens qui disent const parfois signifie quelque chose de différent dans les deux langues sont également correctes.

Mais ce sont surtout des points mineurs et personnellement, je pense qu'en vérité, il y est relativement faible, conséquence d'aller à l'autre. C'est une question de style, et je pense que les différents groupes de gens vont vous donner des réponses différentes.

En termes d'utilisation, l'historique d'utilisation, et la plus courante de style, en C, c'est beaucoup plus typique de voir #define. À l'aide de C++smsi dans le code C peut se détacher comme étrange pour un certain segment étroit de la C codeurs. (Moi y compris, donc, c'est là que mes préjugés mensonge.)

Mais je suis surpris que personne n'a suggéré un moyen la solution du sol, qui "sent bon" dans les deux langues: si elle correspond à un groupe de constantes entières, utiliser un enum.

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