2010-04-05 7 views
3

Je reçois un message d'erreur "expression doit avoir une valeur constante" lors de l'initialisation d'un tableau de structures avec un entier constant externe.C: Constantes externes dans un tableau de const struct

fichier1.c:

const unsigned char data1[] = 
{ 
    0x65, 0xF0, 0xA8, 0x5F, 0x5F, 
    0x5F, 0x5F, 0x31, 0x32, 0x2E, 
    0x31, 0xF1, 0x63, 0x4D, 0x43, 
    0x52, 0x45, 0x41, 0x54, 0x45, 
    0x44, 0x20, 0x42, 0x59, 0x3A, 
    0x20, 0x69, 0x73, 0x70, 0x56, 
// ... 
}; 
const unsigned int data1_size = sizeof(data1); 

fichier2.c:

const unsigned char data2[] = 
{ 
    0x20, 0x44, 0x61, 0x74, 0x61, 
    0x20, 0x52, 0x6F, 0x77, 0x20, 
    0x3D, 0x20, 0x34, 0x38, 0x12, 
//... 
}; 
const unsigned int data2_size = sizeof(data2); 

Get_Byte.c:

extern const unsigned char * data1; 
extern const unsigned int data1_size; 
extern const unsigned char * data2; 
extern const unsigned int data2_size; 

struct Array_Attributes 
{ 
    const unsigned char * p_data; 
    const unsigned int  size; 
}; 

const struct Array_Attributes Data_Arrays[] = 
{ 
    {data1, data1_size}, // Error message is for data1_size here. 
    {data2, data2_size}, // Another error message generated for data2_size here. 
}; 

J'ai aussi enlevé le const qualificateur du champ size de Array_Attributes et obtenez le même message d'erreur.

Pourquoi le compilateur se plaint-il d'une expression de valeur constante lorsque data1_size et data2_size sont const unsigned int mais dans une unité de traduction différente?

Je veux un tableau constant de [adresse de tableau, taille de tableau] qui est généré au moment de la compilation.

J'utilise Green Hills ccarm 4.24, sur Windows XP, langage C NOT C++.

Répondre

7

Le qualificatif const de C a peu à voir avec ce que le compilateur considère comme constant expression, dans ce cas. Dans un initialiseur, à savoir

const struct attributes attrs[] = { 
    { expr1, expr2 }, 
    ... 
} 

expr1 et expr2 doit avoir des formes très spécifiques pour être acceptable pour le compilateur. Le résultat de ces restrictions est que les expressions peuvent être évaluées sans être extraites des variables du programme, car elles n'existent pas lors de la compilation.

Vous essayez d'utiliser data1_size et data2_size, qui ne sont pas des constantes de temps de compilation selon ces règles.

Par ailleurs, les déclarations

const unsigned char data1[] = { ... }; 

et

extern const unsigned char *data1; 

ne sont pas compatibles et conduiront à un bug dans votre code. Ce dernier devrait être

extern const unsigned char data1[]; 
+0

Ma compréhension est que 'data1 []' et '* data1' sont les mêmes. Comment sont-ils différents et pourquoi vont-ils conduire à des bugs? –

+0

Le seul endroit où ils peuvent être remplacés est avec une déclaration de paramètre. 'extern char * foo' indique au compilateur que' foo' est une variable de 4 octets contenant un pointeur sur un caractère. 'extern char bar []' indique au compilateur que 'bar' est une constante d'adresse qui pointe vers un bloc de caractères de taille inconnue. 'foo [i]' récupère d'abord le pointeur de 4 octets, ajoute 'i', puis déréférence pour obtenir un caractère. 'bar [i]' prend la valeur 'bar', ajoute' i', et dereferences. –

+1

http://c-faq.com/aryptr/aryptr1.html –