Проблема вы столкнулись в том, что для того, чтобы инициализировать переменную (global_2
здесь), это значение (или все значения того, что он зависит от того, в вашем случае global_1
) необходимо знать.
Когда вы инициализируете переменную в функции, тогда ее значение должно быть известно только во время выполнения, и это обычно так, или вы получите неопределенную ошибку символа во время компиляции или ссылки.
Глобалы должны быть инициализированы компилятором во время компиляции.
extern int global_1;
говорит компилятору, что global_1
существует, но не в этом модуле компиляции. Он будет доступен после ссылки. Вы можете использовать его в функциях, но компоновщик должен сначала связать его с объектным файлом, который на самом деле содержит его.
Таким образом, компилятор не может инициализировать его во время компиляции, в результате чего вы видите ошибку. Связывание происходит после компиляции.
Если вам нужно инициализировать глобальные переменные, которые ссылаются на глобальные переменные в другом компиляторе, вам нужно будет сделать это в функции. Например, первый стебель в main()
.
Вы хотите сказать, что проблема 'int global_2'? – lulyon
Проблема заключается в * инициализации * 'global_2'. – alk
Не смешивать воду, но _IF_ вы используете агрегированные типы (такие как struct, array, union), а также с использованием расширений ANSI C99, тогда выражения допускаются во время объявления/инициализации, например: 'int gloabal_2 [2] = {global_1 * 3, global_1 * 10}; '. Важно также иметь в виду, что @Sergey сказал ниже, что объект, используемый в любом выражении, должен быть уже инициализирован. – ryyker