Избыточный #include в C / C ++? - PullRequest
       31

Избыточный #include в C / C ++?

2 голосов
/ 20 октября 2011

Предположим, теперь у меня есть три исходных файла: ClassA.hpp, ClassB.hpp и ClassC.hpp.

ClassB наследуется от ClassA, а ClassC наследуется от ClassB.ClassB.hpp, я написал #include "ClassA.hpp".Затем в ClassC.hpp, помимо включения ClassB.hpp, я должен также включить ClassA.hpp?

При написании файлов Makefile я должен сделать зависимость ClassA.oa от ClassC.o?И в cmake - если я не напишу #include "ClassA.hpp" в ClassC.hpp, ClassA.o не будет зависимостью от ClassC.o, верно?Это нормально?

Ответы [ 2 ]

5 голосов
/ 20 октября 2011

Требуется ли ClassC.hpp содержимое ClassA.hpp, игнорируя в данный момент ClassB.hpp?

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

Редактировать: В случае наследования, к которому относится вопрос, все немного по-другому. Это тот случай, когда вы можете полагаться на B, требующий A, и можно сказать, что вы напрямую не полагаетесь на A (если B изменен на наследование от Q, C больше не может нуждаться в A). Вы хотите посмотреть, от чего зависит заголовок или класс, и включить файл, обеспечивающий это. Если оно напрямую зависит от чего-либо, включите его напрямую.

Включение заголовка несколько раз может быть сделано безвредным с использованием средств защиты заголовков и очень распространено в больших кодовых базах.

0 голосов
/ 20 октября 2011

Что касается марки, ClassC.o не должен зависеть от ClassA.o.Он должен иметь зависимость от ClassA.hpp, который обычно генерируется, даже если он включается косвенно через ClassB.hpp.

Я хотел бы, чтобы ClassB.hpp явно включал ClassA.hpp, если он полагается на определенные вещив ClassA.hpp.Я думаю, что так чище.

...