Лучше ли определять глобальные (внешние) переменные в одном заголовке или в соответствующих заголовочных файлах? - PullRequest
2 голосов
/ 26 августа 2011

Я работаю над небольшим программным проектом, который я надеюсь выпустить в будущем как открытый исходный код, поэтому я надеялся собрать мнения о том, каковы наилучшие в настоящее время практики в отношении этой проблемы.

Само приложение является процедурным, не объектно-ориентированным (мне нет необходимости инкапсулировать функции рендеринга или функции обработки событий в классе), но некоторые аспекты объекта Приложение в значительной степени ориентировано на объект (например, консоль сценариев, которая в значительной степени зависит от ОО). OO-аспекты кода имеют стандартные файлы object.cpp и object.h.

Что касается процедурной части, мой код разделен на различные файлы (например, main.cpp, render.cpp, events.cpp), каждый из которых может иметь некоторые глобальные переменные, специфичные для этого файла. У меня также есть соответствующие заголовочные файлы для каждого, определяющие все функции и переменные (как extern), которые я хочу быть доступными из других файлов. Затем я просто #include правильный заголовок, когда мне нужен доступ к этой функции / переменной из другого исходного файла.

Сегодня я понял, что у меня также может быть другой вариант: создать один заголовочный файл globals.h, где я мог бы определить все глобальные переменные (как снова extern) и функции, которые потребуются за пределами конкретного исходного файла. Затем я мог бы просто #include этот файл во всех исходных файлах (вместо каждого отдельного заголовочного файла, как я делаю сейчас). Кроме того, используя этот метод, если мне нужно было преобразовать переменную / функцию в глобальную (вместо локальной), я мог бы просто добавить запись в файл заголовка.


Вопрос : Лучше ли использовать соответствующий файл заголовка для каждого .cpp файла (и определить переменные / функции, которые я хочу, чтобы они были глобально доступны в этих заголовках ) или использовать один заголовочный файл для объявления всех глобально доступных переменных / функций?


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

Ответы [ 4 ]

3 голосов
/ 26 августа 2011

Для меня лучше иметь заголовочный файл, соответствующий каждому файлу реализации (c или cpp). Вы должны думать о своих классах, структурах и функциях как о модулях, и если вы разделяете свою реализацию, логично, что вы разделяете и свои делами.

Другое дело, что при изменении заголовочного файла все файлы, которые его содержат, перекомпилируются во время сборки. И в конце я могу сказать вам, что это может занять много времени. Вы можете избежать восстановления всего, правильно разделив ваши декларации.

2 голосов
/ 26 августа 2011

Я бы порекомендовал иметь больше заголовков и вкладывать в них меньше.Вы должны иметь список включений, но это легко понять и отредактировать, если это неправильно.

С одним большим глобалом сложнее справиться, если что-то пошло не так.Если вам нужно что-то изменить, это изменение потенциально далеко идущее и сопряжено с высоким риском.

В этом случае больше кода не является плохой вещью.

Незначительный момент - время компиляциибудет увеличиваться супер линейно, чем больше вы поместите в этот один большой заголовок, так как каждый файл должен его обрабатывать.Во встроенном проекте это, вероятно, меньше беспокоит, но, как правило, наличие большого количества заголовков начнет давить на вас.

1 голос
/ 26 августа 2011

Лучше поместить их все в один файл и вообще не компилировать этот файл . Если у вас есть глобальные переменные, вам следует переосмыслить свой дизайн, особенно если вы занимаетесь разработкой приложений, а не низкоуровневым программированием систем.

0 голосов
/ 26 августа 2011

Как я уже сказал в комментариях под вопросом, первое, что нужно сделать, это попытаться удалить все глобальные данные.Если это невозможно, вместо одного большого заголовка или добавления внешнего вида в заголовок каждого класса, я бы выбрал третий подход.

Скажем, ваш класс Event должен иметь глобальный экземпляр.Если вы объявляете глобальный экземпляр в event.cpp и извлекаете его в event.hpp, то это, по сути, делает эти файлы не пригодными для повторного использования где-либо еще.Бросить его в globals.cpp и globals.hpp тоже не идеально, потому что каждый раз, когда глобальный заголовок изменяется, есть вероятность, что весь ваш проект будет перестроен, потому что заголовок включен всеми.

Итак, третийОпция заключается в создании сопутствующего заголовка и исходного файла для каждого класса, который должен иметь глобальный экземпляр.Таким образом, вы объявите глобальный экземпляр Event в event_g.cpp и извлечете его в event_g.hpp.

Да, это уродливо, и да, это утомительно.Но в глобальных данных нет ничего приятного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...