2010-11-19 3 views
1

Предположим, у меня есть файл заголовка inclusions.h, который имеет все #include <...> s для моего проекта. inclusions.h содержит другой файл заголовка, называемый settings.h, где могут быть изменены различные константы.Взаимное включение файлов заголовков

Если #include <math.h> в inclusions.h, будет ли settings.h иметь доступ к математической библиотеке? Или мне нужно #include <math.h> в settings.h?

+1

Вы пробовали? Что случилось? –

+0

Небольшая заметка тоже, по умолчанию, когда вы программируете на чипах C для микрочипов, они автоматически выполняют то, что вы предлагаете для своих заголовков HardwareProfile.h. Они загружают «стандартный» заголовок, который вы будете модифицировать, чтобы включить в него необходимый для настройки. Иногда такие вещи выполняются, чтобы сохранить «стандарты» для более крупной организации. AKA, чтобы использовать xyz, включить этот специализированный заголовок, но если вам нужно сделать xzy, включите этот. Лично ... включая все заголовки, где это особенно необходимо, так я это делаю. – g19fanatic

ответ

5

Если math.h включен до settings.h, settings.h также должен иметь доступ к math.h. Но для обеспечения доступа (и для указания зависимостей) вы должны включать файлы, в которых они нужны, а также в math.h.

+0

А, это имеет смысл. Разве не плохая практика включать библиотеки не один раз? – Maxpm

+1

@Maxpm нет. –

+1

Нет, это определенно неплохая практика. Напротив, включение всех возможных заголовков в каждый другой заголовок с использованием центрального файла заголовка является плохой практикой. Просто укажите заголовки, где они нужны, и не более, но, если требуется, несколько раз. Включение охранников в любом случае предотвращает двойные объявления. – Flinsch

3

Это зависит от порядка включений. #include - это препроцессорная директива, которая просто работает путем текстовой подстановки. Так, если в inclusions.h у вас есть:

#include <math.h> 
#include <settings.h> 

настройки "можно увидеть" математику. Если у вас есть:

#include <settings.h> 
#include <math.h> 

не может. Но: что произойдет, если вы использовали settings.h в другом месте без включая math.h? Поэтому, в конце концов, попробуйте сделать каждый из них независимым от файла.

1

В этом случае, как отметили другие, в зависимости от порядка включения он может быть доступен. Это связано с тем, что эти исходные файлы являются частью одной единицы перевода (источник + включает по существу), поэтому, если <math.h> подходит к "settings.h", он может быть доступен для просмотра. Однако, если настройки стали частью другой единицы перевода, или если вы решили переместить некоторые из них, это может измениться. Чтобы быть «безопасным», вы должны просто включить любые файлы заголовков, необходимые для файла в этом файле.

Смежные вопросы