Нет, компилятор (или, точнее, препроцессор) не позаботится об этом "автоматически". Не в Visual C ++ 2008 или в любой другой версии. И ты действительно не хотел бы этого.
Есть два стандартных способа сделать это. Вы должны выбрать один из них.
Первый известен как включает охранников . Это "#ifndef
трюк", который вы упомянули в своем вопросе. Но это, конечно, не "трюк". Это стандартная идиома для обработки этой ситуации при написании кода на C ++, и любой другой программист, который смотрит на ваш исходный файл, почти наверняка ожидает, что увидит, что где-то есть охранники.
Другой использует преимущества функции VC ++ (которая также появилась в нескольких других наборах инструментов C ++) для выполнения, по сути, того же самого способа, который несколько проще набирать. Включив строку #pragma once
в верхней части файла заголовка, вы даете указание препроцессору включать файл заголовка только один раз на единицу перевода. Это имеет ряд других преимуществ по сравнению с охраной, но здесь они не особенно актуальны.
Что касается вашего второго вопроса, компоновщик позаботится об «оптимизации» функций, которые вы никогда не вызываете в своем коде. Но это последний этап компиляции, и он не имеет ничего общего с #include
, который обрабатывается препроцессором, как я упоминал выше.