2010-11-18 9 views
1

Dans un projet, je dois définir un const int, je définir dans un en-tête comme:Comment définir const int dans le fichier .h correctement?

extern const int a; 

Et j'inclure cette tête de fois. Puis dans un seul fichier source, j'ai mis:

const int a=10; 

Cependant, quand j'ai besoin d'utiliser un dans un tableau lié; i.e. .:

int anarray[a]; 

Je reçois:

"array bound is not an integer constant" 
erreur

. Pourquoi?

Répondre

10

Un tableau lié doit être une expression constante intégrale . Pour être un intégrale expression constante une expression ne doit impliquer (parmi quelques autres) littéraux, enum valeurs et const variables ou static membres de données que si elles sont initialisés avec -expressions constantes.

const Les variables de type entier ne sont pas les expressions constantes entières si elles n'ont pas d'initialiseur.

C'est une règle de langage qui permet à l'implémentation de connaître certaines valeurs constantes au moment de la compilation sans connaître d'autres unités de traduction (qui ne peuvent pas être compilées en même temps et qui peuvent être modifiées indépendamment).

const Les variables de l'étendue d'espace de noms ont une liaison interne par défaut (c'est-à-dire sans un extern explicite), donc vous ne rencontrerez aucun problème de définition multiple si vous faites quelque chose comme ceci.

// header.h 
const int a = 10; 

.

// source.cpp 
int anarray[a]; 
0

Si cela ne change jamais vraiment, pourquoi ne pas simplement faire #define?

+1

#defines doivent être évités, en fonction de la séquence dans laquelle les en-têtes sont inclus, vous pourriez changer quelque chose involontairement. – ThomasW

4

La dimension de tableau doit être connue au moment de la compilation. Pour les constantes comme celle-ci, vous pouvez envisager d'utiliser une énumération à la place. De cette façon, sa valeur est visible dans l'en-tête et vous obtenez toujours le nom symbolique lors du débogage (contrairement à l'utilisation d'un #define).

// foo.h 

enum { 
    a = 10; // array dimension 
}; 

et

// foo.c 

#include "foo.h" 

int anarray[a]; 
+1

Je ne suis pas sûr de comprendre quel avantage 'enum {a = 10; }; 'a sur' const int a = 10; '. Pouvez-vous développer? –

+0

@Charles: vous ne pouvez pas mettre 'const int a = 10;' dans un fichier .h - certains compilateurs vous permettent de le faire, d'autres non. –

+0

@Paul R: Euh, je peux. Que voulez-vous dire exactement? –

2

La valeur d'un besoin constant d'être connu à la compilation. extern les variables ne le sont pas: si du tout, leurs valeurs ne peuvent être déterminées qu'au moment du lien, ce qui vient après l'étape de compilation. Donc, en ce qui concerne le compilateur, un extern est pas une constante.