Ричард был несколько прав (почему его решение было записано?).
В любом случае, все заголовки C/C++ должны использовать внутренние защитные устройства.
При этом, как:
1 - Ваш унаследованный код не поддерживается на самом деле больше, и вы должны использовать скомпилированные заголовки (которые хак, но эй ... Ваша потребность ускорить ваш сбор, не рефакторинг неподдерживаемый код)
2 - Ваш старый код по-прежнему живет. Затем вы либо используете предварительно скомпилированные заголовки, либо/или охранники/внешние охранники для временного решения, но в конце вам нужно будет удалить все ваши включенные, один .C или .CPP за раз и скомпилировать каждый. C или .CPP по одному, исправляя их включение с помощью forward-declarations или включая при необходимости (или даже разбивая большой, включайте в более мелкие, чтобы каждый файл .C или .CPP получал только те заголовки, которые ему нужны). В любом случае, тестирование и удаление устаревших включений является частью технического обслуживания проекта, поэтому ...
Мой собственный опыт с предварительно скомпилированными заголовками был не совсем хорошим, потому что в течение половины времени компилятор не мог найти символ, который у меня был и поэтому я попробовал полную «чистую/перестроить», чтобы убедиться, что не был предварительно скомпилированный заголовок, который был устаревшим. Поэтому я предполагаю использовать его для внешних библиотек, которые вы даже не будете касаться (например, заголовки STL, C API, Boost, что угодно). Тем не менее, мой собственный опыт был с Visual C++ 6, так что я думаю (надеюсь?), Они поняли это правильно.
Теперь, последнее: заголовки всегда должны быть самодостаточными. Это означает, что если включение заголовков зависит от порядка включения, то у вас есть проблема. Например, если вы можете написать:
#include "AAA.hpp"
#include "BBB.hpp"
Но нет:
#include "BBB.hpp"
#include "AAA.hpp"
потому что BBB зависит от ААА, то все у вас есть зависимость, вы никогда не признается в коде.Не признавая это с помощью определения, вы сделаете вашу компиляцию кошмаром. BBB также должен включать AAA (даже если он может быть несколько медленнее: в конце концов, декларации в прямом направлении будут в любом случае чистыми бесполезными, поэтому у вас должен быть быстрый таймер компиляции).
Единственная проблема с ними в том, что они выглядят ужасно. – 2008-09-21 10:02:02
И они добавляют скрытую зависимость, то есть с внешними защитами, файлы знают определения, защищающие их включенные файлы. Но если у вас есть способ убедиться, что ваши охранники уникально сгенерированы (например, с использованием полного имени проекта и файла), то это не должно быть проблемой. – paercebal 2008-09-21 10:16:49