2015-10-02 2 views
2

Каково практическое использование extern в C? Не будет ли глобальная переменная работать одинаково при использовании в нескольких файлах?Практическое использование extern в C?

head.h Файл

int i; 

Это включается на несколько файлов и работает, как ожидалось. Тогда каково надлежащее использование extern?

+2

Одна из причин того, что если вы используете какую-либо библиотеку, она дает вам больше возможностей для чтения. вы должны объявить 'extern int i; 'в вашей программе. Это дает понять, что вы используете переменную i, которая не объявлена ​​здесь. – Adi

+0

https://stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keyword-in-c#comments-499330 –

ответ

3

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

1

Вы можете использовать extern для доступа к переменным в разных файлах ...

например увидеть это:

file1.c

// Integer with external binding 
int global1 = 10; 
// REFERENCE to an external defined variable defined in file2.c 
extern int global2; 
// Integer with internal binding (not accessible with extern from other files) 
static int internal1 = 20; 

void print1() { 
    printf("%d, %d, %d", global1, global2, internal); 
} 

file2.c

// REFERENCE to an external defined variable defined in file1.c 
extern int global1; 

// Integer with external binding 
int global2 = 20; 

void print2() { 
    // you wont be able to reach internal1 here! Even with extern! 
    printf("%d, %d", global1, global2); 
} 

Вы видите, внешний ключевое слово указывает компилятору, что существует глобальная переменная, но в другом файле. Вы можете ссылаться на переменные, объявленные где-то в другом месте (например, во внешней библиотеке или другом объектном файле). Также он значительно повысит читаемость исходного кода и поможет избежать переменных с одним и тем же именем! Его хорошая практика для его использования ...

И btw: Глобальные переменные по умолчанию extern. Добавление static изменяет их на внутренние переменные!

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