Вы должны объявить переменную в файле заголовка:
extern int x;
, а затем определить ее в одном файле C:
int x;
В C разница между определением и объявлением заключается в том, что определение резервирует пространство для переменной, тогда как объявление просто вводит переменную в таблицу символов (и заставляет компоновщик искать ее, когда дело доходит до время ссылки).
Вы можете (должны) объявить его как extern
в заголовочном файле и определить это ровно 1 файл .c.
Обратите внимание, что этот файл .c также должен использовать заголовок и что стандартный шаблон выглядит так:
// file.h
extern int x; // declaration
// file.c
#include "file.h"
int x = 1; // definition and re-declaration
Ключ состоит в том, чтобы объявления переменных в заголовочном файле и исходном файле были одинаковыми.
Я использую этот трюк
------sample.c------
#define sample_c
#include sample.h
(rest of sample .c)
------sample.h------
#ifdef sample_c
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN int x;
Sample.c компилируется только один раз и он определяет переменные. Любому файлу, который включает sample.h, присваивается только «extern» переменной; он выделяет место для этой переменной.
Когда вы меняете тип x, он изменится для всех. Вам не нужно помнить об изменении его в исходном файле и файле заголовка.
Если вы объявите его как
int x;
в файле заголовка, который затем включается в нескольких местах, вы получите несколько экземпляров x (и, возможно, проблемы с компиляцией или компоновкой).
Правильный подход к этому - указать в файле заголовка
extern int x; /* declared in foo.c */
, а затем в foo.c вы можете сказать
int x; /* exported in foo.h */
. Тогда вы можете включить файл заголовка в любое количество мест.