Вы изложили две основные философии на эту тему.
Мое собственное мнение (и я думаю, что это все, что можно на самом деле иметь в этом) заключается в том, что заголовки должны быть максимально автономными. Я не хочу знать все зависимости foo.h
, чтобы иметь возможность использовать этот заголовок. Я также презираю необходимость включать заголовки в определенном порядке.
Однако разработчик foo.h
также должен взять на себя ответственность за то, чтобы сделать его как можно более независимым. Например, заголовок foo.h
должен быть написан так, чтобы он не зависел от stdio.h
, если это вообще возможно (использование форвардных объявлений может помочь в этом).
Обратите внимание, что стандарт C запрещает стандартному заголовку включать другой стандартный заголовок, но стандарт C ++ этого не делает. Таким образом, вы можете увидеть проблему, которую вы описываете при переходе с одной версии компилятора C ++ на другую. Например, в MSVC, включая <vector>
, используемый для ввода <iterator>
, но это больше не встречается в MSVC 2010, поэтому код, скомпилированный ранее, может больше не работать, поскольку вам может понадобиться специально включить <iterator>
.
Однако, хотя может показаться, что стандарт C поддерживает вторую философию, имейте в виду, что он также требует, чтобы ни один заголовок не зависел от другого, и что вы можете включать заголовки в любом порядке. Таким образом, вы получаете лучшее из обоих миров, но ценой сложности для разработчиков библиотеки C. Для этого им нужно прыгнуть через несколько обручей (особенно для поддержки определений, которые могут быть введены через любой из нескольких заголовков, например NULL
или size_t
). Я думаю, что люди, которые разработали стандарт C ++, решили добавить, что сложность для имитаторов больше не является разумной (я не знаю, в какой степени разработчики библиотек C ++ используют преимущества «лазейки» - похоже, что MS может ужесточить это, даже если это технически не требуется).