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.
Réponses
Trop de publicités?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.
Les constantes doivent être préférés define
s. 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
define
s 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.
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++.
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
.