Я нашел, что лучший способ организовать ваши данные - это следовать двум простым правилам:
- Объявлять только в заголовочных файлах.
- Определите вещи в файлах C (или cpp, но здесь я просто буду использовать C для простоты).
Под объявлением я подразумеваю уведомлять компилятор о существовании вещей, но не выделяю для них память. Это включает typedef
, struct
, extern
и т. Д.
По определению, I обычно означает «выделить место для», например int
и т. Д.
Если у вас есть строка вроде:
int aaa;
в заголовочном файле, каждый модуль компиляции (в основном определяется как входной поток для компилятора - файл C вместе со всем, что он вводит с #include
, рекурсивно) получит свою собственную копию. Это вызовет проблемы, если вы свяжете два объектных файла вместе, для которых определен один и тот же символ (за исключением определенных ограниченных обстоятельств, таких как const
).
Лучший способ сделать это - определить переменную aaa
в одном из ваших файлов C, а затем поставить:
extern int aaa;
в вашем заголовочном файле.
Обратите внимание, что если ваш заголовочный файл включен только в один файл C, это не проблема. Но в этом случае у меня, вероятно, не было бы даже файла заголовка. Заголовочные файлы, на мой взгляд, предназначены только для обмена информацией между блоками компиляции.