Переменная в двух исходных файлах

Я прочитал этот код экзамена.

"Ас":

int global_1 = 100;

"До нашей эры":

extern int global_1;
int global_2 = global_1 * 2;

int main()
{
    return 0;
}

gcc "ошибка: элемент инициализатора не является константой"

Я не пишу этот код, но я хочу знать, почему и как это исправить.

Благодарю.

2 ответа

Решение

Ошибка говорит само за себя: инициализаторы должны быть константами.

Чтобы исправить это, вы можете изменить свой код следующим образом:

int global_2 = 0;

int main()
{
  global_2 = global_1 * 2;

Проблема, с которой вы сталкиваетесь, заключается в том, что для инициализации переменной (global_2 здесь) это значение (или все значения того, от чего оно зависит, в вашем случае global_1) нужно знать.

Когда вы инициализируете переменную в функции, тогда ее значение нужно знать только во время выполнения, и это, как правило, имеет место, иначе вы получите неопределенную ошибку символа во время компиляции или соединения.

Глобальные переменные должны быть инициализированы компилятором во время компиляции.

extern int global_1;

Говорит компилятору, что global_1 существует, но не в этом модуле компиляции. Это будет доступно после ссылки. Вы можете использовать его в функциях, но компоновщик должен сначала связать его с объектным файлом, который фактически содержит его.

Таким образом, компилятор не может инициализировать его во время компиляции, что приводит к появившейся ошибке. Связывание происходит после компиляции.

Если вам нужно инициализировать глобальные переменные, которые ссылаются на глобальные переменные, в другом модуле компиляции, то вам нужно будет сделать это в функции. Например, первый ствол в main(),

Другие вопросы по тегам