2012-02-12 2 views
18

Есть некоторые случаи, когда мы включаем .cpp файл вместо стандартного заголовочного файла (.h), например:Включите .cpp вместо заголовка (.h)

#include "example.cpp" 

вместо

#include "example.h" 

Кажется, что это работает, но это безопасно или я должен его избегать?

А как насчет времени компиляции?

+0

Это так же безопасно, как и вы. Как правило, это не обязательно. Программирование - это не слепое следование за некоторым грузовым самолетом, а скорее * понимание * того, что вы делаете, и принятие решений на основе понимания и рассуждений. –

+1

Единственная действительная причина, которую я когда-либо видел для этого, - это сохранить время ссылки. [Unity Build объясняется здесь] (http://stackoverflow.com/questions/543697/include-all-cpp-files-into-a-single-compilation-unit). –

+0

@sysop: Как я уже сказал: ** понять **, что вы делаете, и сначала спросить. Включенные обрабатываются препроцессором *, задолго до того, как произойдет компиляция. Поймите препроцессор, и вы узнаете, когда все в порядке, чтобы включить вещи. –

ответ

19

Это ленивое кодирование. Используйте заголовочные файлы. Да, они могут увеличить время компиляции, но они означают, что вы можете легко повторно реализовать куски вашего кода, или еще лучше, другой разработчик мог в любое время. Файл заголовка служит в качестве шаблона для вашего кода C/C++. Плохая идея отказаться или проигнорировать это.

+0

Я всегда пользуюсь .h, но у нас здесь довольно дебаты, и поэтому я спрашиваю. – sysop

+2

@sysop - честно говоря, «Это ленивое кодирование» немного гиперболично. Бывают случаи, когда это действительно может быть правильным, но в общем случае я бы сказал, что это плохая форма. – zellio

+8

Включение файлов '.h' вместо файлов' .cpp' может ускорить ** время компиляции, потому что оно позволяет выполнять частичную перекомпиляцию. – tom

1

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

+0

Всегда есть другой вариант: a.k.a. никогда не говорят никогда. – LihO

3

Есть законное использование для #include "impl.cpp":

  1. тестирование для доступа к статическим/и т.д. переменных

  2. специальные шаблоны, подобные этим, если механизм C++ шаблон оказывается неадекватным (редко)

    #define MACRO (...)

    #include "impl.cpp" // uses MACRO

Отметьте, что #include "impl.cpp" может быть небезопасным, этот же файл включен в отдельные единицы компиляции, которые позже связаны друг с другом.

7

Я согласен с Kerrek SB.

Я сделал это один раз. Я создавал отличную, широко используемую библиотеку сжатия, которую нужно было разделить отдельно для 8-битных изображений и 12-битных изображений. Самый чистый способ, который я мог придумать, чтобы вписаться в систему сборки, был (слишком упрощает), чтобы иметь два основных файла .cpp, один из которых устанавливает #defines для 8-битной сборки, а другой для 12-битной сборки. Мастер-файлы .cpp затем #include исходные файлы библиотеки сжатия.

Это нормально не следовать общему правилу, если вы достаточно хорошо понимаете правило, чтобы знать причины этого и почему это может не применяться в вашем случае. (Но эти случаи должны быть редкими.)

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