Заголовочный файл и ключевое слово extern

У меня много проблем с использованием внешних переменных и файлов заголовков. Я читал разделы книг и несколько часов искал в Интернете, но я не мог понять. Любая помощь в понимании этой проблемы будет принята с благодарностью. Ниже приведен код и ошибка при попытке скомпилировать

#include  #include  #include  #include "sample.h" int main() { int i; int gI = 0; double recv; i = 10; gI = i; recv = AnotherFunc(); return 0; } 

И sample.h является следующим

  #ifndef SAMPLE #define SAMPLE extern int gI; extern double AnotherFunc(); #endif 

Другая функция – это

  #include  #include  #include  #include  #include "sample.h" double AnotherFunc() { double someVar; int test; test = gI; someVar = 10.0; return someVar; } 

Когда я компилирую следующий способ, я получаю следующие ошибки, которые я не понимаю, почему я получаю эти ошибки. sample.h имеет объявление переменной, и оно должно быть видимым в AnotherFunc.

  gcc -Wall -ansi -pedantic -c Main.c AnotherFunc.c gcc Main.o AnotherFunc.o -o test AnotherFunc.o: In function `AnotherFunc': AnotherFunc.c:(.text+0x6): undefined reference to `gI' collect2: ld returned 1 exit status 

Я только добавил int gI = 0; потому что я хотел его определить. Если я изменю код следующим образом, я также получу ошибку в main. См. Ниже.

  #include  #include  #include  #include "sample.h" int main(int argc, char *argv[]) { int i; double recv; i = 10; gI = i; recv = AnotherFunc(); return 0; } gcc -Wall -Wstrict-prototypes -ansi -pedantic -c Main.c AnotherFunc.c gcc Main.o AnotherFunc.o -o test Main.o: In function `main': Main.c:(.text+0x1b): undefined reference to `gI' AnotherFunc.o: In function `AnotherFunc': AnotherFunc.c:(.text+0x6): undefined reference to `gI' collect2: ld returned 1 exit status 

Переместите int gI = 0 за пределы main() чтобы он был доступен по всему миру:

 int gI = 0; int main() { int i; .... } 

Вам нужно объявить свои переменные перед их использованием и определить их ровно один раз.

Это заявление:

 extern int gI; 

В основном это говорит о том, что существует int gI который будет определен в другом месте.

Это определение:

 int gI; 

Это фактически создает int named gI . (Технически это декларация, а также определение.)

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

Если вы хотите поместить int gI в файл sample.h , он будет включен в оба ваших файла .c . Это также будет проблемой, поскольку правило состоит в том, чтобы определить переменные ровно один раз, и вы будете определять его дважды (один раз в каждом файле).

Решение заключается в размещении объявления extern в файле .h и определении в одном из ваших .c файлов.

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

проверьте эту ссылку. хорошо объяснено Как использовать extern для обмена переменными между исходными файлами?

Вы определили gI в области функции main (), что делает его видимым только оттуда. Я подозреваю, что вам действительно нужна глобальная переменная gI (следовательно, выражение extern int gI).

Если вы хотите, чтобы AnotherFunc () увидел его, переместите int gI = 0 снаружи, например, в том же файле, что и определение AnotherFunc ().

gI должно быть объявлено выше main :

 int gI = 0; int main(void) { ... } 

Делая это, у gI есть область файлов и внешняя связь.

Возможно, лучшее место для объявления gI будет в sample.c , если есть такой файл.