Подтвердить что ты не робот

Объявление переменной в файле заголовка

В случае, если у меня есть переменная, которая может использоваться в нескольких источниках - хорошая практика объявить ее в заголовке? или лучше объявить его в файле .c и использовать extern в других файлах?

4b9b3361

Ответ 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 */

Единственное обратное, что я вижу, это то, что защитник включения не сохраняет вас, если вы включили его дважды в один и тот же файл.