В чем разница между .h (заголовочный файл) и .cpp файлом? - PullRequest
3 голосов
/ 04 июля 2010

Я создаю приложение windows: формы.Я прочитал некоторые ответы, чтобы попытаться понять концепцию .h (заголовочный файл) и .cpp (файлы реализации).Как я создал графический интерфейс для моего приложения.Я заметил код, помещенный в файл .h.Но когда я дважды щелкнул элемент управления кнопки, чтобы добавить код в процедуру, код был создан в файле .h вместо файла .cpp.Я вырезать и поместить этот код в файл .cpp, или это где ссылки вступают?Определение процедуры остается в файле .h и будет связано с кодом процедуры в файле .cpp.

Ответы [ 5 ]

3 голосов
/ 04 июля 2010

Здесь есть два соображения.Во-первых, заголовочные файлы не так важны в управляемом коде, как в родном C или C ++.Компиляторы управляемого кода читают объявления из метаданных сборки, вы не должны (и не должны) писать объявления типов C ++ / CLI, которые должны быть видны в других модулях в заголовочных файлах.Получение их из метаданных делает ваши типы доступными для любого .NET языка.

Но настоящая причина в том, как работает дизайнер форм в C ++ IDE.Это генератор кода, управляемый элементами управления, которые вы перетаскиваете на форму или пользовательский элемент управления, и свойствами, которые вы устанавливаете в окне «Свойства».Существует очень неловкая проблема, если этот генератор кода должен генерировать код в двух отдельных файлах.Не столько генерирующий бит, сколько удаление кода при изменении дизайна формы.Синхронизация файлов приводит к трудностям в диагностике ошибок компиляции из автоматически сгенерированного кода.Это происходит гораздо чаще, чем вы думаете, между прочим, генератор кода должен работать с файлами исходного кода, которые находятся в процессе редактирования.Очень сложно, код может вообще не анализироваться.

В C ++ IDE используется оригинальный подход, принятый дизайнерами C # и VB.NET версии 1.1, все идет в одном файле.Что неприятно, конечно, объявления и код не должны смешиваться.Это было решено в этих дизайнерах для версии 2.0 путем добавления поддержки языков C # и VB.NET для частичных классов.Однако этого не произошло для C ++ / CLI.Не уверен почему, команда C ++ / CLI всегда выглядела ограниченной по сравнению с другими командами.Он также не имеет никакой поддержки рефакторинга, что очень важно для переименования методов при изменении имени класса.Хранение встроенных методов позволяет избежать этой проблемы.

В любом случае, вы можете получить свой код в файле .cpp, но вы должны сделать это самостоятельно.Cut + paste делает это, но вам также придется отредактировать имя класса обратно в объявления метода.Это высокое техническое обслуживание, подумайте, стоит ли оно усилий.Также подумайте, действительно ли вы хотите использовать C ++ / CLI для пользовательского интерфейса, это редкий выбор.

3 голосов
/ 04 июля 2010

Как уже говорили другие, файл заголовка предназначен для объявлений класса, функции, типа и т. Д., В то время как файл .cpp должен содержать реализации функций.Однако компилятору все равно, где написан код реализации, поэтому вы можете поместить весь свой код в сам заголовок.Но это увеличит время компиляции, потому что весь этот код будет скомпилирован в каждом файле, в который вы включаете этот заголовочный файл.

Хранение реализации отдельно очень полезно, если вы хотите распространять свой код, но должныпроприетарный код скрыт.В этом случае вы можете создать библиотеку из кода реализации и распространить заголовок вместе с библиотекой.

Исключением является случай написания кода шаблона;в этом случае реализация должна идти в заголовок, потому что компилятор должен «увидеть» его на месте вызова.

1 голос
/ 04 июля 2010

Предполагается, что файлы заголовков (* .h) содержат определения ваших классов, методов и типов, в то время как файлы cpp предполагают наличие подробностей реализации. Обычно в заголовочных файлах есть встроенные и короткие методы.

Эта практика не применяется компилятором, поэтому вы можете написать реализацию (т.е. код) внутри файла заголовка.

1 голос
/ 04 июля 2010

Прототипы функций (вы называли их определениями процедур) должны находиться в заголовочном файле (вместе с макросами). Любой код должен находиться в файле .cpp.

Если вы уверены, что вы думаете о перемещении, это код, его следует перенести туда. Это поможет вставить некоторый код.

0 голосов
/ 04 июля 2010

Лично я перемещаю этот автоматически сгенерированный код в * .cpp файлы.В файлах * .h я оставляю функции, которые не будут меняться очень часто.Я делаю это, чтобы быть уверенным, что время компиляции не будет сильно увеличиваться после каждого внесенного мной изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...