В случае, если у меня есть переменная, которая может использоваться в нескольких источниках - хорошая практика объявить ее в заголовке? или лучше объявить его в файле .c
и использовать extern
в других файлах?
Объявление переменной в файле заголовка
Ответ 1
Вы должны объявить переменную в файле заголовка:
extern int x;
а затем определите его в одном файле C:
int x;
В C разница между определением и объявлением заключается в том, что определение резервирует пространство для переменной, тогда как декларация просто вводит переменную в таблицу символов (и заставит компоновщик искать ее, когда дело доходит до время ссылки).
Ответ 2
Вы можете (должны) объявить его как extern
в заголовочном файле и определить его точно в формате .c.
Обратите внимание, что этот .c файл также должен использовать заголовок и что стандартный шаблон выглядит следующим образом:
// file.h
extern int x; // declaration
// file.c
#include "file.h"
int x = 1; // definition and re-declaration
Ответ 3
Если вы объявите его как
int x;
в заголовочном файле, который затем включается в несколько мест, вы получите несколько экземпляров x (и потенциально скомпилируйте или свяжите проблемы).
Правильный способ приблизиться к этому - иметь файл заголовка
extern int x; /* declared in foo.c */
а затем в foo.c вы можете сказать
int x; /* exported in foo.h */
THEN вы можете включить свой заголовочный файл на столько мест, сколько хотите.
Ответ 4
Ключ должен содержать объявления переменной в файле заголовка и исходном файле.
Я использую этот трюк
------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, он изменится для всех. Вам не нужно будет менять его в исходном файле и файле заголовка.
Ответ 5
Как насчет этого решения?
#ifndef VERSION_H
#define VERSION_H
static const char SVER[] = "14.2.1";
static const char AVER[] = "1.1.0.0";
#else
extern static const char SVER[];
extern static const char AVER[];
#endif /*VERSION_H */
Единственное обратное, что я вижу, это то, что защитник включения не сохраняет вас, если вы включили его дважды в один и тот же файл.