Итак, мы используем #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)?
Вы должны проверить наличие охранников. https: //en.wikipedia.org/wiki/Include_guard – Gavin
Включите защитные функции, и я не знаю, как включить в них те же две вещи. Я хочу иметь возможность включать что-то в свой код в 10 разных местах, если это необходимо, несмотря на то, что компилятор/компоновщик использует только первый, к которому он обращается. – Karlovsky120
Я не понимаю, какую проблему вы пытаетесь решить, или решение, которое вы предлагаете – user463035818