Курсы программирования в Киеве - Extern
Ключевое слово "extern" используется в C и C++ для указания на то, что переменная или функция определены в другом месте либо находятся внутри динамически подключаемой библиотеки.
Если переменная объявлена как extern, то компилятор знает, что ее определение будет находиться где-то в другом месте в коде, и не будет создавать новую переменную с таким же именем. То есть, мы можем объявить переменную в одном файле, а определить её в другом файле и использовать в обоих местах. Например:
file1.c:
c
extern int x;
int foo(void) {
return x;
}
file2.c:
c
int x = 10;
main.c:
c
#include
int foo();
int main(void) {
printf("%d\n", foo()); // выведется 10
return 0;
}
Здесь мы объявляем переменную x как extern в file1.c, чтобы компилятор знал, что определение переменной будет в другом месте. А в file2.c мы определяем саму переменную x и присваиваем ей значение 10. В main.c мы подключаем функцию foo и выводим её значение в stdout.
Как для переменных, так и для функций ключевое слово extern может быть неявным, то есть компилятор будет считать, что все функции и переменные не определены в данном файле являются extern. Например:
file1.c:
c
int x;
int foo(void) {
return x;
}
file2.c:
c
extern int x;
int y;
int bar(int z) {
return x + y + z;
}
main.c:
c
#include
int foo();
int bar(int);
int main(void) {
x = 10;
int y = 20;
printf("%d\n", foo()); // выведется 10
printf("%d\n", bar(30)); // выведется 60
return 0;
}
Здесь переменная x, объявленная в file1.c, считается неявно extern, а функция и переменная, объявленные в file2.c, явно объявляются как extern. В main.c мы присваиваем значение 10 переменной x, объявленной в file1.c, и объявляем новую переменную y со значением 20. В функции bar мы складываем значения x, y и z и возвращаем их. Выводим значения foo и bar в stdout.
Все переменные и функции, объявленные в другом файле как extern, должны иметь одинаковый тип и имя. Если тип или имя будет отличаться, компилятор может выдать ошибку.
Также стоит отметить, что в C++ ключевое слово extern может использоваться для объявления переменных и функций шаблонных классов, подключаемых из других файлов. В таком случае синтаксис будет выглядеть следующим образом:
c++
extern template class MyClass; // MyClass определен в другом файле