90 votes

Pourquoi la plupart des développeurs C utilisation définir au lieu de const ?

Dans de nombreux programmes un `` joue le même rôle comme une constante. Par exemple.

Je vois souvent le premier formulaire préféraient plutôt que l’autre, en s’appuyant sur le pré-processeur pour gérer ce qui est fondamentalement une décision d’application. Y a-t-il une raison pour cette tradition ?

156voto

Il y a une raison très solide pour cela : `` c ne veut pas dire quelque chose est constante. Cela signifie simplement qu'une variable est en lecture seule.

Dans les endroits où le compilateur requiert une véritable constante (par exemple, pour des tailles de pile pour les matrices non-VLA), en utilisant un variable, telles que n’est tout simplement pas possible.

23voto

Vovanium Points 2170

Non, ils sont différents.

const est juste un qualificatif, qui dit à la variable(!) qu'il ne peut pas être modifiée lors de l'exécution. Mais tous les autres attributs de variable persistent: il a de stockage alloué, et ce stockage peut être adressée. Si aucun code ne pas l'utiliser comme littéral, mais se réfère à elle en accédant à l'emplacement de mémoire spécifiée (uniquement en cas de statc il peut simplement être optimisé), et en le convertissant vers un type de données lors de l'exécution. Et comme il ont de stockage alloué, si vous l'ajoutez à en-tête et de l'inclure dans plusieurs sources c, vous obtiendrez un lien d'erreur de plusieurs la définition du symbole jusqu'à ce que vous marquez comme extern. Et dans ce cas le compilateur shoudn pas optimiser du code par rapport à sa valeur réelle (jusqu'à l'optimisation globale est sur).

#define remplace simplement un nom avec sa valeur. De plus, en #define'd constante peut être utilisé dans de préprocesseur: #ifdef d'avoir de compilation conditionnelle au moment de sa valeur, stringize # d'avoir de la chaîne avec sa valeur. Et comme compilateur peut analyser sa valeur, il peut optimiser le code qui dépend d'elle et de faire des conversions demandées au moment de la compilation.

Pour cet exemple de code:

#define SCALE 1

...

scaled_x = x * SCALE;

Alors qu'il ont SCALE défini à l' 1 compilateur supprime simplement multiplications qu'elle sait qu' x * 1 == x,, mais si il ont (extern) const, il fera attention à compiler const chercher et réelle de la multiplication, car il ne peut pas réaliser ce qui sera constante comme elle va être connu que sur la liaison de la scène. (Extern est nécessaire pour l'utilisation constante à partir de plusieurs fichiers source).

De plus près l'équivalent de la définition de l'est à l'aide d'énumérations:

enum dummy_enum{
   constant_value = 10010
};

Mais il limité à des valeurs entières et ont pas les avantages de l' define, de sorte qu'il n'est pas largement utilisé.

const est utile lorsque vous devez importer la valeur de la constante à partir d'une bibliothèque où il compilé. Ou si elle est utilisée avec des pointeurs. Ou c'est le tableau de valeurs constantes accessible via la variable valeur de l'indice. Jusqu'à ce qu'un besoin de ce const n'ont aucun avantages par rapport define.

14voto

R.. Points 93718

La raison est que la plupart du temps, vous voulez une constante, pas un -variable qualifiée. Les deux ne sont pas à distance les mêmes en langage C. Par exemple, les variables ne sont pas valides dans le cadre des initialiseurs pour -stockage-objets de durée, comme les dimensions de la matrice de non-vla (par exemple la taille d’un tableau dans une structure, ou n’importe quel tableau pre-C99).

8voto

John Bode Points 33046

L'expansion sur la R de la réponse un peu: fieldWidth n'est pas une expression constante; c'est un const-qualifiés variable. Sa valeur n'est pas établie jusqu'à ce moment de l'exécution, de sorte qu'il ne peut pas être utilisée lorsqu'une constante de compilation de l'expression est requise (comme dans une déclaration de tableau, ou à un cas étiquette en switch déclaration, etc.).

Comparer avec la macro FIELD_WIDTH, qui, après prétraitement étend à l'expression constante 10; cette valeur est connue au moment de la compilation, de sorte qu'il peut être utilisé pour les dimensions du tableau, les étiquettes de caisse, etc.

6voto

Jens Gustedt Points 40410

Pour ajouter à la réponse de R. et de Bart : il y a qu’une seule façon de définir des constantes de temps de compilation symbolique dans les constantes de type énumération C:. La norme impose que ceux-ci sont de type `` . Personnellement, J’écrirais ton exemple comme

Mais je suppose que le goût diffère beaucoup parmi les programmeurs C à ce sujet.

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