Подтвердить что ты не робот

Visual Studio 2010, Intellisense и PCH: каковы альтернативы уродливому stdafx.h?

Недавно я переключился на Visual Studio 2010, а Intellisense не получал полминуты, чтобы отображаться при использовании библиотек boost, предложение Microsoft, похоже, использует предварительно скомпилированные заголовки.

За исключением того, что я никогда раньше их не использовал (кроме случаев, когда он был вынужден Ugly ATL Wizards (TM)), поэтому я искал вокруг, чтобы выяснить, как они работают.

В принципе, большой централизованный подход stdafx.h кажется неправильным. Я никогда не хочу включать (даже дешево) целую кучу файлов заголовков во всех моих источниках. Поскольку я не использую библиотеки Windows (я делаю С++/CLI более высокоуровневые обертки, а затем использую .NET для общения с внешним миром), у меня нет "цельного грузовика без изменений огромных заголовков". Просто boost и стандартные библиотеки заголовков разбросаны вокруг.

В этой проблеме есть интересный подход, но я не могу понять, как это сделать. Кажется, что каждый исходный файл должен быть скомпилирован дважды (пожалуйста, поправьте меня, если я ошибаюсь): один раз с /Yc и один раз с /Yu. Это добавляет нагрузку на разработчика, который должен вручную настроить систему сборки.

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

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

4b9b3361

Ответ 1

Ваша проблема в основном заключается в том, что Intellisense медленнее для Boost в VS2010? У меня нет прямого решения этой проблемы, но может ли Visual Assist X быть для вас вариантом? Я использовал его в различных версиях Visual Studio сейчас и с большим удовольствием. Не прямое решение, но это может сработать для вас.

Ответ 2

Во-первых, вы читаете статью неправильно. Каждый файл НЕ скомпилирован дважды. Файл stdafx.cpp скомпилируется один раз с /Yc (c, for create) перед чем-либо другим, а затем каждый другой файл в вашем проекте скомпилируется один раз с помощью /Yu (u, для использования) и импортирует результат ранее созданного сохраненного состояния от stdafx.cpp.

Во-вторых, статья 7 лет и говорит о VС++ 6, поэтому вы должны начать с недоверия. Но даже если предположить, что информация в нем по-прежнему применяется к VС++ 2008 или 2010, это кажется плохим советом. Подход, который он рекомендует использовать /pragma hdrstop, является решением, которое ищет проблему. Если у вас есть заголовки, содержащие вещи, которые вы не хотите в каждом файле, то они просто не должны идти в ваш предварительно скомпилированный заголовок.

Ответ 3

Предварительно скомпилированные заголовки не так уж плохи, если вы их правильно используете.

Не используйте их в качестве замены для правильных и точных #includes, но как способ ускорить процесс. Достичь этого, сделав precompiled заголовок ничего не делать в сборках релизов, только ускорение в отладке.

Ответ 4

Вы ошибаетесь, каждый файл компилируется только один раз. У вас есть один файл .cpp, скомпилированный с /Yc, а остальные скомпилированы с помощью /Yu. Файл с /Yc, который по умолчанию является stdafx.cpp, содержит одну строку, #include "myMainHeader.h" (изменил имя по умолчанию). Все остальные .cpp файлы должны начинаться С#include "myMainHeader.h". Когда ваш /Yc компилируется, сохраняется все внутреннее состояние компилятора. Этот файл загружается при компиляции каждого из ваших других файлов. Вот почему вы должны начать с включения PCH, так что параметр /Yu не изменит результат компиляции, а только время. Xcode не делает этого требования и будет использовать PCH независимо от того, будет ли ваш .cpp файл запущен с правильной директивой include. Я использовал библиотеки, которые полагались на это и не могли быть построены без PCH.