2013-09-06 1 views
2

Я прочитал этот код экзамена.переменная в двух исходных файлах

"ас":

int global_1 = 100; 

"Ьс":

extern int global_1; 
int global_2 = global_1 * 2; 

int main() 
{ 
    return 0; 
} 

НКУ дают «ошибка: инициализатор элемент не является постоянным»

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

ответ

1

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

Чтобы исправить это, вы хотели бы изменить код так:

int global_2 = 0; 

int main() 
{ 
    global_2 = global_1 * 2; 
+0

Вы хотите сказать, что проблема 'int global_2'? – lulyon

+0

Проблема заключается в * инициализации * 'global_2'. – alk

+1

Не смешивать воду, но _IF_ вы используете агрегированные типы (такие как struct, array, union), а также с использованием расширений ANSI C99, тогда выражения допускаются во время объявления/инициализации, например: 'int gloabal_2 [2] = {global_1 * 3, global_1 * 10}; '. Важно также иметь в виду, что @Sergey сказал ниже, что объект, используемый в любом выражении, должен быть уже инициализирован. – ryyker

3

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

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

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

extern int global_1; 

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

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

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

+0

Спасибо за объяснение вашего рода, но здесь действительно проблема не в 'extern', а ответ @alk уже решил мою проблему. Так что просто дайте вам преимущество. – lulyon