Вы должны объявить константу в файле .h
и определить ее в одном файле .c
:
bar.h:
extern const struct foo bar;
bar.c:
#include "bar.h"
/* do this in a single file */
const struct foo bar = ...;
Затем включите bar.h
везде, где вы хотите получить доступ bar
:
что-то.c:
#include "bar.h"
void doSomethingWithBar() {
struct *foo something = &bar;
...
}
Редактировать (Шахбаз): причина, почему этоработает, и ваш код не работает в том, что, когда вы включаете файл, содержимое этого файла копируется и вставляется вместо #include (это независимо от файла, вы можете включить что угодно, в том числе файлы с расширением .h простоконвенция).Поэтому, когда вы говорите const struct foo bar;
в заголовочном файле и включаете его в два файла, это похоже на запись этой строки в обоих файлах, поэтому определение переменной в обоих файлах и, следовательно, ошибка ссылки.
Защита вашего заголовкатакже не работает (
#ifndef __BAR_H__
#define __BAR_H__
... header contents
#endif
), потому что каждый из ваших исходных файлов компилируется отдельно, поэтому, когда bar.h включен в один файл и определен __BAR_H__
, когда компилируется следующий файлэто определение __BAR_H__
потеряно.