web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois un message d'erreur indiquant que l'initialiseur n'est pas une constante?

J'utilise le code suivant.

const int X_Origin = 1233086;             
const int Y_Origin = -4728071;              
const int Z_Origin = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};

Lorsque je le compile, GCC me donne l'erreur suivante.

Transformations.h: 16: 1: erreur: l'élément d'initialisation n'est pas constant

Qu'est-ce que ça veut dire? Comment puis-je réparer mon code?

10
CodeKingPlusPlus

Vous ne pouvez pas faire cela au niveau global en C, mais uniquement au niveau local, c’est-à-dire au sein d’une fonction:

#define NUM_DIMENSIONS 3

const int X_Origin = 1233086;             
const int Y_Origin = -4728071;              
const int Z_Origin = 4085704;

const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin}; // FAIL

void foo(void)
{
    const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin}; // OK
}

Sinon, vous pouvez compiler le code en C++ plutôt qu'en C.

14
Paul R

Souvent, les gens sont induits en erreur par la dénomination du mot clé const, ce qui implique quelque chose de valeur constante qui ne peut pas être modifié. En C au moins, cela signifie en lecture seule . Les objets qualifiés const à la portée du fichier ne possèdent pas la constance appropriée pour servir d'initialiseurs de tableau.

Comme exemple pour une constance non constante, il est parfaitement correct de déclarer

 const volatile unsigned int milliseconds_since_boot;

étant une valeur qui est mise à jour en dehors du contrôle du compilateur (pensez registre HW) et que vous n'êtes pas autorisé à affecter, c'est-à-dire qu'elle est en lecture seule.

20
Jens

Je ne suis pas un bon programmeur;) mais je ferais ceci:

#define X_Origin (1233086)
#define Y_Origin (-4728071)
#define Z_Origin (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};

De cette façon, c'est juste une substitution de texte. Si le compilateur crache toujours le mannequin, au moins, vous êtes sur le point de savoir où est le problème.

6
John U

En guise d'alternative, cela fonctionnerait également dans ce cas:

enum { X_Origin = 1233086,
       Y_Origin = -4728071,
       Z_Origin = 4085704 };

const int xyzOrigin[] = { X_Origin, Y_Origin, Z_Origin };

int main()
{
    return 0;
}
4
hmjd

En langage C, les objets à durée de stockage statique doivent être initialisés avec des expressions constantes ou des initialiseurs agrégés contenant des expressions constantes. - Réponse de AndreyT

Après la lecture, vous devez savoir que NUM_DIMENSIONS, s'il possède la qualification const-, n'est pas une constante! Ensuite, vous ne pouvez pas initialiser votre tableau de cette façon.

Pour utiliser ce code:

const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};

Vous devriez utiliser: #define NUM_DIMENSIONS 3 ou vous pouvez simplement déclarer sans aucune variable entre crochets const int xyzOrigin[] = {X_Origin, Y_Origin, Z_Origin};

2
waldyr.ar

Comme le dit le triclosan:

main()
{
    const int X_Origin = 1233086;
    const int Y_Origin = -4728071;
    const int Z_Origin = 4085704;
    const int xyzOrigin[] = {X_Origin, Y_Origin, Z_Origin};
}

cela fonctionne bien ...

ou, si vous connaissez les dimensions à l'avance, ceci:

#define DIM 3

main()
{
    const int X_Origin = 1233086;
    const int Y_Origin = -4728071;
    const int Z_Origin = 4085704;
    const int xyzOrigin[DIM] = {X_Origin, Y_Origin, Z_Origin};
}
0
Bruno Oliveira