2013-09-22 1 views
0

Я прочитал, что если я хочу использовать глобальную переменную в другом файле C, я должен предшествовать тип данных с спецификатора доступа ехЬегп так:Могу ли я использовать «int» вместо «extern» int в другом файле?

File One        File Two 
int x, y;       extern int x, y; 
char ch;        extern char ch; 
int main(void)      void func22(void) 
{          { 
/* ... */        x = y/10; 
}          } 
void func1(void)      void func23(void) 
{          { 
x = 123;        y = 10; 
}          } 

и по ошибке в файле двух я не 't объявлять x, y такими, какие они есть. Я объявил их int x и int y, и я жду, когда компилятор отобразит ошибку переопределения переменных x и y, но код работает без ошибок.

, например:

Файл Один

#include <stdio.h> 

int global = 1000; /** declare global variable called 
         global **/ 

int main(){ 

print(); 

return 0; 
} 

Файл Два

int global; /** here I don't use the extern keyword **/ 

void print(void){ 

global = 100; 

printf("\n global = %d",global); 

return; 

} 

результат: global = 100

Программа скомпилирована и связана без ошибок

Так что мой вопрос: есть ли спецификатор extern здесь?!

+0

Нет ошибки компиляции –

+0

@ArmiaWagdy: Правильно, получилось - вы * ожидали * ошибка компилятора (или ошибка компоновщика ?!), но не получили один ... –

+0

ДА, так, можете ли вы помочь меня в этой проблеме ?! @KerrekSB –

ответ

0

Вы не получаете никакой ошибки, потому что компилятор не проверяет тип и наличие внешней переменной. На этапе связывания линкер ищет в объектных файлах ссылку на символ с именем x (или y).

+0

, так ли это избыточно здесь? !! Можете ли вы объяснить мне больше о том, что здесь делает компилятор? –

+0

Это не избыточно, ключевое слово 'extern' сообщает компилятору, что там где-то есть символ с именем' x', тогда компоновщик ищет определение этого символа в связанных объектах. Если «extern» не существует, символы переопределяются, что приводит к ошибке привязки (дубликат символа с именем x) – pNre

+0

, но также нет ошибки связывания! –

Смежные вопросы