C: Внешние константы в массиве константных структур - PullRequest
3 голосов
/ 05 апреля 2010

Я получаю сообщение об ошибке «выражение должно иметь постоянное значение» при инициализации массива структур с целым числом внешней константы.

file1.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);

file2.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.
};

Я также удалил квалификатор const из поля size Array_Attributes и получил то же сообщение об ошибке.

Почему компилятор жалуется на выражение постоянного значения, когда data1_size и data2_size равны const unsigned int, но в другой единице перевода?

Мне нужен постоянный массив [адрес массива, размер массива], который генерируется во время компиляции.

Я использую Green Hills ccarm 4.24, в Windows XP, язык C NOT C ++.

1 Ответ

7 голосов
/ 05 апреля 2010
В этом случае квалификатор

C const имеет мало общего с тем, что компилятор считает constant expression. В инициализаторе, т.е.

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

expr1 и expr2 должны иметь очень специфические формы, чтобы быть приемлемыми для компилятора. Результатом этих ограничений является то, что выражения могут быть вычислены без выборки из программных переменных, поскольку они не существуют при компиляции.

Вы пытаетесь использовать data1_size и data2_size, которые по этим правилам не являются постоянными времени компиляции.

Кстати, декларации

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

и

extern const unsigned char *data1;

несовместимы и приведут к ошибке в вашем коде. Последний должен быть

extern const unsigned char data1[];
...