2016-10-15 2 views
2

Итак, мы используем #include, чтобы сообщить компилятору/линкеру, где найти все соответствующие коды для класса.Ввод включает в себя все нужные места

Посмотрите на это:

ClassC.h: 
    #include "ClassA.h"; 

ClassD.h: 
    #include "ClassC.h" 

Допустим, мы используем ClassA в нашем ClassD, но таким образом, что это никак не связано с ClassC. Мы косвенно включили его, включив ClassC, поэтому ошибка не возникает. Однако, если код не изменится и ClassC больше не понадобится (и из-за этого мы удалим #include "ClassC.h"), мы получим неопределенную опорную ошибку, так как ClassA теперь не найден.

Есть ли способ, чтобы компилятор/компоновщик смотрел на каждый из * .cpp и назначал * .h самостоятельно, не глядя на включенные файлы .h?

Если бы это было так, это не выглядело бы в ClassC.h и, как видите, оно содержит ClassA.h, но выведите ошибку или, по крайней мере, предупреждение о том, что я не включил ClassA.h. Это имеет больший смысл, поскольку, насколько известно классу 3, ClassA и ClassC не имеют никакого отношения друг к другу (по установленному предположению я использую ClassA независимо от ClassC).

Я думаю, что написанный таким образом код был бы намного более стабильным и устойчивым к изменению. Не так ли?

Кроме того, предположим, что мы строим проект, и он работает. Если бы мы тогда ссылались на некоторый класс (X) ранее в коде, чем раньше, мы могли бы получить ошибку, если бы он использовал какой-то другой класс (Y), который был включен из какого-то другого источника между этой точкой в ​​программе, и предыдущее первое вхождение этого класса. Если мы привязали более близко к каждому заголовочному файлу, который явно использует его, такие ошибки никогда не появятся.

Я знаю, что я мог бы отслеживать все это сам, но было бы так легко пропустить несколько или более крупных проектов, даже средних. Кроме того, с ошибкой/предупреждением было бы намного проще управлять.

Я знаю, что я немного усложняю ситуацию, но для меня это кажется хорошей практикой.

Это даже хорошая идея и может ли это быть каким-то образом задано в параметрах компилятора/компоновщика (например, GNU gcc-компилятор в CodeBlocks)?

+1

Вы должны проверить наличие охранников. https: //en.wikipedia.org/wiki/Include_guard – Gavin

+0

Включите защитные функции, и я не знаю, как включить в них те же две вещи. Я хочу иметь возможность включать что-то в свой код в 10 разных местах, если это необходимо, несмотря на то, что компилятор/компоновщик использует только первый, к которому он обращается. – Karlovsky120

+0

Я не понимаю, какую проблему вы пытаетесь решить, или решение, которое вы предлагаете – user463035818

ответ

1

Предположим, что мы используем ClassA в нашем ClassD, но таким образом, который никоим образом не является , подключенным к ClassC. Мы косвенно включили его, включив в него ClassC, поэтому ошибка не возникает. Однако, если смена кода и ClassC больше не требуется (и мы исключаем #include "ClassC.h" ), мы получили бы неопределенную ошибку ссылки, так как ClassA теперь не имеет аналогов.

Если вам нужно использовать ClassA в вашем ClassD, то явно#include "ClassA.h" в вашем ClassD.h. Do не полагаться на неявный цепи включений.

+0

Я хочу это сделать. Я просто хочу знать, есть ли способ для компилятора сделать чек для меня. – Karlovsky120

+0

@ Karlovsky120: На данный момент я не знаю, что вы точно имеете в виду. У компилятора нет психических полномочий, чтобы угадать, какие заголовки вы хотите. В любом случае, если вы не включаете требуемые заголовки, вы получаете ошибки компилятора или компоновщика. –

+0

В основном я имел в виду, если компилятор/компоновщик может определить, был ли он явным или неявным, а бросить предупреждение в нем было неявным. Это может быть трудно сделать, поскольку некоторые неявные включенные (например, наследуемые от родительского класса) будут прекрасны, поскольку они всегда будут присутствовать. – Karlovsky120