Да, есть лучший способ.
Проблема, с IMHO, в «стиле мастера» предварительно скомпилированных заголовков состоит в том, что они поощряют необязательное соединение и делают повторное использование кода сложнее, чем должно быть. Кроме того, код, который был написан в стиле «просто вставь все в stdafx.h», может быть проблематичным, поскольку изменение чего-либо в любом заголовочном файле может привести к тому, что вся кодовая база будет перекомпилироваться каждый раз. Это может привести к тому, что простой рефакторинг будет длиться вечно, так как каждое изменение и цикл перекомпиляции занимает гораздо больше времени, чем нужно.
Лучший способ, опять же ИМХО, это использовать #pragma hdrstop и / Yc и / Yu. Это позволяет вам легко настраивать конфигурации сборки, в которых используются предварительно скомпилированные заголовки, а также создавать конфигурации, в которых не используются предварительно скомпилированные заголовки. Файлы, использующие предварительно скомпилированные заголовки, не имеют прямой зависимости от самого предварительно скомпилированного заголовка в исходном файле, что позволяет создавать их с предварительно скомпилированным заголовком или без него. Файл проекта определяет, какой исходный файл создает предварительно скомпилированный заголовок, а строка #pragma hdrstop в каждом исходном файле определяет, какие из них берутся из предварительно скомпилированного заголовка (если используется), а какие - непосредственно из исходного файла ... Это означает, что когда При выполнении обслуживания вы будете использовать конфигурацию, в которой не используются предварительно скомпилированные заголовки, и будет восстановлен только тот код, который необходимо перестроить после изменения файла заголовка. При выполнении полных сборок вы можете использовать предварительно скомпилированные конфигурации заголовков, чтобы ускорить процесс компиляции. Еще одна хорошая вещь, связанная с наличием опции не скомпилированного заголовка, заключается в том, что он гарантирует, что ваши cpp-файлы содержат только то, что им нужно, и включают все, что им нужно (что сложно, если вы используете «стиль мастера» скомпилированного заголовка.
Я написал немного о том, как это работает здесь: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html (не обращайте внимания на материал о / FI), и у меня есть несколько примеров проектов, которые собираются здесь с помощью методов #pragma hdrstop и / Yc / Yu: http://www.lenholgate.com/blog/2008/04/practical-testing-16---fixing-a-timeout-bug.html.
Конечно, переход от использования скомпилированного заголовка 'wizard style' к более контролируемому стилю часто бывает нетривиальным ...