Да, включение одного и того же заголовка несколько раз означает, что файл должен быть открыт до того, как включится защита препроцессора и предотвратит множественные определения.Исходный код Mozilla использует следующий трюк, чтобы предотвратить это:
Foo.h
#ifndef FOO_H
#define FOO_H
// whatever
#endif /* FOO_H */
Во всех файлах, которые должны включать foo.h
#ifndef FOO_H
#include "foo.h"
#endif
Thisпредотвращает многократное открытие foo.h.Конечно, это зависит от того, соблюдает ли каждый конкретное соглашение об именах для своих защитников препроцессора.
Вы не можете сделать это со стандартными заголовками, так как для их защиты препроцессора не существует общего соглашения об именах.* EDIT: После прочтения вашего вопроса, я думаю, вы спрашиваете о том же заголовке, включенном в разные исходные файлы.То, о чем я говорил выше, не поможет с этим.Каждый заголовочный файл все равно нужно будет открыть и включить хотя бы один раз в каждую единицу перевода.Единственный известный мне способ предотвратить это - использовать предварительно скомпилированные заголовки, как указано в его ответе @ scorcher24 .Но я бы держался подальше от этого решения, потому что не существует стандартного способа генерирования предварительно скомпилированных заголовков для разных компиляторов, если время компиляции не является абсолютно непомерным.