Как правильно использовать stdafx.h?

Каков правильный способ использования stdafx.h с точки зрения разделения зависимостей?

Если я поместил все там, то мои компиляторы быстро вспыхивают, и все, что мне нужно сказать в любом файле, - это

#include "stdafx.h"

с оговорками, которые:

  1. Я больше не знаю, какие файлы зависят от того, какие заголовки.
  2. Это уменьшает модульность, делая мой код менее многоразовым.
  3. Я больше не могу отделять C #include от C++ (например, cstring versus string.h) без большой боли. (Говоря о том, что это даже имеет значение?)

Если я ничего не добавлю, я могу организовать все хорошо - но тогда мои компиляции резко сократились.

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

Есть ли хорошо известное/хорошо принятое решение этой проблемы?

Ответ 1

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

Обычно я размещаю стандартные заголовки и другие библиотеки, такие как все, что включает.

Ответ 2

При использовании предварительно скомпилированных заголовков вы должны убедиться, что ваш проект компилируется чисто даже без присутствия PCH (так что рассматривайте его как оптимизацию, а не замену для включения в каждый TU). Кроме того, не ставьте абсолютно все (и, что более важно, никогда не ставьте заголовки из своего собственного проекта), PCH должен содержать только те, которые не меняются или изменяются очень редко - системные библиотеки, внешние зависимости) а скорее попытайтесь сохранить большинство использованных/больших вещей, предварительно скомпилированных.

Ответ 3

Лично я предпочел бы более медленную компиляцию, чем никакую идею (видимость), как зависимости. Однако есть все ограничения.

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

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

Ответ 4

У компилятора Yor может быть флаг "show includes". Включите его и найдите глубоко вложенные иерархии, которые повторяются. Подумайте о включении одного из самых мелких файлов include в ваш заголовок для каждого такого глубокого дерева.

Ответ 5

Условно включите PCH, затем определите что-то вроде "#define _PRE_COMPILE_". Таким образом, исходные заголовки все еще видны, а код является модульным, если вам это нужно. Примером этого может быть включение

#ifdef _PRE_COMPILE_
#include "stdafx.h"
#elif
#include <iostream>
#include <cstring>
#endif

Включите это в начале каждого исходного файла.