Переменная в двух исходных файлах
Я прочитал этот код экзамена.
"Ас":
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()
,