C ++ многофайловый процесс компиляции - PullRequest
2 голосов
/ 04 октября 2011

Я пытаюсь свести к минимуму включение заголовка в проект, максимально использовать предварительные декларации, и мне необходимо выяснить, как именно работает процесс компиляции C ++.

Он начинается с main.cpp, гдемы выделяем объект A, поэтому мы включаем Ah. Класс A использует классы B и C, поэтому я включаю Bh и Ch. Теперь, если бы я хотел выделить B в main.cpp, компиляция не удалась бы.

Я могу легко включитьBh в main.cpp, но мне интересно, действительно ли это необходимо, потому что я уже включаю Ah, а в Ah я включаю Bh, я читал некоторые предыдущие обсуждения по этой теме, где было что-то о рекурсии и перекомпиляцииисходный файл.Так как же это работает?

Спасибо за любой совет.:)

1 Ответ

1 голос
/ 04 октября 2011

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

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

Вы можете точно увидеть, что препроцессор готовит для компилятора, если вам это интересно.GCC имеет следующий синтаксис.

g++ -E main.cpp

MSVC обладает аналогичной функциональностью, хотя я не могу ее процитировать.

Я легко могу включить Bh в main.cpp, но мне интересно, действительно ли это необходимо, потому чтоЯ уже включаю Ах, а в Ах я включаю Bh

Это вопрос обстоятельств, я полагаю.Основное раздражение при пропуске заголовков заключается в том, что обычно происходит что-то, когда кто-то меняет что-то в разрозненной части базы кода, и вам приходится догадываться, почему вы пропускаете символы при обновлении из системы контроля версий.По сути, вы создаете зависимости между заголовками, которые вообще не ясны.

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

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