Объявление переменной в заголовочном файле [дубликат]

4 ответа

Вы должны объявить переменную в файле заголовка:

extern int x;

, а затем определить ее в одном файле C:

int x;

В C разница между определением и объявлением заключается в том, что определение резервирует пространство для переменной, тогда как объявление просто вводит переменную в таблицу символов (и заставляет компоновщик искать ее, когда дело доходит до время ссылки).

102
ответ дан 24 November 2019 в 17:07
поделиться

Вы можете (должны) объявить его как extern в заголовочном файле и определить это ровно 1 файл .c.

Обратите внимание, что этот файл .c также должен использовать заголовок и что стандартный шаблон выглядит так:

// file.h
extern int x;  // declaration

// file.c
#include "file.h"
int x = 1;    // definition and re-declaration
34
ответ дан 24 November 2019 в 17:07
поделиться

Ключ состоит в том, чтобы объявления переменных в заголовочном файле и исходном файле были одинаковыми.

Я использую этот трюк

------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, он изменится для всех. Вам не нужно помнить об изменении его в исходном файле и файле заголовка.

3
ответ дан 24 November 2019 в 17:07
поделиться

Если вы объявите его как

int x;

в файле заголовка, который затем включается в нескольких местах, вы получите несколько экземпляров x (и, возможно, проблемы с компиляцией или компоновкой).

Правильный подход к этому - указать в файле заголовка

extern int x; /* declared in foo.c */

, а затем в foo.c вы можете сказать

int x; /* exported in foo.h */

. Тогда вы можете включить файл заголовка в любое количество мест.

11
ответ дан 24 November 2019 в 17:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: