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++.
Ma compréhension est que 'data1 []' et '* data1' sont les mêmes. Comment sont-ils différents et pourquoi vont-ils conduire à des bugs? –
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. –
http://c-faq.com/aryptr/aryptr1.html –