Инициализация константных переменных в C - PullRequest
0 голосов
/ 13 октября 2018

Я хочу построить две библиотеки lib1.a и lib2.a .

lib2.a находится на верхнем уровне, он может делиться только с lib1.a глобальными данными, но не с заголовочными файлами.Тогда lib1.a может использовать эти данные, используя ключевое слово extern.

Я обнаружил трудность: я хочу инициализировать константу в file1.c внутри lib1.a с данными, определенными в lib2.a .

Пример:

//lib1.a->file1.c:
const My_Var_Type My_Var = {
    .field1 = data1,
    .field2 = data2,
    .field3 = data3,
    .field4 = data4
};

Теперь data1 - data4 должен быть получен из lib2.a , я объявил их как константу, но никак!Компилятор генерирует эту ошибку:

   initializer element is not constant

Есть ли способ исправить эту ошибку?

1 Ответ

0 голосов
/ 13 октября 2018

Вы не можете инициализировать статические объекты хранения (глобальные или имеющие атрибут static), используя неконстантные выражения - например, другие переменные.Не имеет значения, являются ли эти объекты const не

Это недопустимо:

extern int data1, data2, data3, data4;

typedef struct
{
    int field1;
    int field2;
    int field3;
    int field4;
}My_Var_Type;

  const My_Var_Type My_Var=
     {
      .field1 = data1,   /* wrong */
      .field2 = data2,   /* wrong */
      .field3 = data3,   /* wrong */
      .field4 = data4,   /* wrong */
     };


int main()
{
    /* .... */
    return 0;
}

Вы можете инициализировать таким образом автоматические переменные.

int main()
{
  const My_Var_Type My_Var=
     {
      .field1 = data1,   /* good */  
      .field2 = data2,   /* good */
      .field3 = data3,   /* good */
      .field4 = data4,   /* good */
     };

    /* ....*/

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...