2010-07-04 4 views
3

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

+1

Возможный дубликат [CPP | .h файлов (C++)] (http://stackoverflow.com/questions/1990156/cpp-h-files-c) –

+0

Не дубликат, файлы .h * играют * очень * различную роль в коде Windows Forms, написанном на C++/CLI. –

ответ

3

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

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

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

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

1

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

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

+0

Если вам не повезло, вы можете обнаружить, что ваш инструмент CASE не сможет найти код после его перемещения; Я бы предложил попробовать это немного за раз. –

1

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

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

3

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

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

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

0

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

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