Файл h что это
Файлы, которые содержат расширение .H, обычно являются заголовочными файлами, используемыми с языками программирования C ++ или C. .H файлы называются «заголовочными файлами» программистами. Они могут состоять из определений внешних переменных, прототипов функций и констант.
Заголовочные файлы в основном являются частью файлов исходного кода, которые требуются для использования функций или констант, определенных в заголовке. Например, если вы определяете текстовую строку, в которой название вашей компании является заголовочным файлом, вы можете использовать эту константу везде, где хотите отобразить, или же вы можете использовать название компании в исходном коде. Если вы хотите изменить имя позже, вам просто нужно сделать это из заголовка и перекомпилировать программу, чтобы сделать ее эффективной.
Программы, которые поддерживают H расширение файла
Ниже вы найдете указатель программ, которые можно использовать для открытия файлов H, разделенных на категории 3 в соответствии с поддерживаемой системной платформой. H файлы можно встретить на всех системных платформах, включая мобильные, но нет гарантии, что каждый из них будет должным образом поддерживать такие файлы.
Заголовочные файлы
Желательно, чтобы каждый .cc файл исходного кода имел парный .h заголовочный файл. Также есть известные исключения из этого правила, такие как юниттесты или небольшие .cc файлы, содержащие только функцию main().
Правильное использование заголовочных файлов может оказать огромное влияние на читабельность, размер и производительность вашего кода.
Следующие правила позволят избежать частых проблем с заголовочными файлами.
Как открыть файл H?
Отсутствие возможности открывать файлы с расширением H может иметь различное происхождение. К счастью, наиболее распространенные проблемы с файлами H могут быть решены без глубоких знаний в области ИТ, а главное, за считанные минуты. Приведенный ниже список проведет вас через процесс решения возникшей проблемы.
Шаг 1. Получить Microsoft Visual Studio
Наиболее распространенной причиной таких проблем является отсутствие соответствующих приложений, поддерживающих файлы H, установленные в системе. Этот легкий. Выберите Microsoft Visual Studio или одну из рекомендованных программ (например, Borland C++, Eclipse IDE, Dev-C++) и загрузите ее из соответствующего источника и установите в своей системе. Выше вы найдете полный список программ, которые поддерживают H файлы, классифицированные в соответствии с системными платформами, для которых они доступны. Если вы хотите загрузить установщик Microsoft Visual Studio наиболее безопасным способом, мы рекомендуем вам посетить сайт Microsoft Corporation и загрузить его из официальных репозиториев.
Шаг 2. Убедитесь, что у вас установлена последняя версия Microsoft Visual Studio
Вы по-прежнему не можете получить доступ к файлам H, хотя Microsoft Visual Studio установлен в вашей системе? Убедитесь, что программное обеспечение обновлено. Может также случиться, что создатели программного обеспечения, обновляя свои приложения, добавляют совместимость с другими, более новыми форматами файлов. Если у вас установлена более старая версия Microsoft Visual Studio, она может не поддерживать формат H. Все форматы файлов, которые прекрасно обрабатывались предыдущими версиями данной программы, также должны быть открыты с помощью Microsoft Visual Studio.
Шаг 3. Свяжите файлы C/C++/Objective-C Header Format с Microsoft Visual Studio
Если у вас установлена последняя версия Microsoft Visual Studio и проблема сохраняется, выберите ее в качестве программы по умолчанию, которая будет использоваться для управления H на вашем устройстве. Следующий шаг не должен создавать проблем. Процедура проста и в значительной степени не зависит от системы
Процедура изменения программы по умолчанию в Windows
- Нажатие правой кнопки мыши на H откроет меню, из которого вы должны выбрать опцию Открыть с помощью
- Далее выберите опцию Выбрать другое приложение а затем с помощью Еще приложения откройте список доступных приложений.
- Наконец, выберите Найти другое приложение на этом. , укажите папку, в которой установлен Microsoft Visual Studio, установите флажок Всегда использовать это приложение для открытия H файлы свой выбор, нажав кнопку ОК
Процедура изменения программы по умолчанию в Mac OS
Шаг 4. Убедитесь, что файл H заполнен и не содержит ошибок
Вы внимательно следили за шагами, перечисленными в пунктах 1-3, но проблема все еще присутствует? Вы должны проверить, является ли файл правильным H файлом. Отсутствие доступа к файлу может быть связано с различными проблемами.
1. Убедитесь, что H не заражен компьютерным вирусом
Если файл заражен, вредоносная программа, находящаяся в файле H, препятствует попыткам открыть его. Сканируйте файл H и ваш компьютер на наличие вредоносных программ или вирусов. Если файл H действительно заражен, следуйте инструкциям ниже.
2. Убедитесь, что структура файла H не повреждена
Если вы получили проблемный файл H от третьего лица, попросите его предоставить вам еще одну копию. Возможно, файл был ошибочно скопирован, а данные потеряли целостность, что исключает доступ к файлу. При загрузке файла с расширением H из Интернета может произойти ошибка, приводящая к неполному файлу. Попробуйте загрузить файл еще раз.
3. Проверьте, есть ли у вашей учетной записи административные права
Иногда для доступа к файлам пользователю необходимы права администратора. Выйдите из своей текущей учетной записи и войдите в учетную запись с достаточными правами доступа. Затем откройте файл C/C++/Objective-C Header Format.
4. Проверьте, может ли ваша система обрабатывать Microsoft Visual Studio
Если в системе недостаточно ресурсов для открытия файлов H, попробуйте закрыть все запущенные в данный момент приложения и повторите попытку.
5. Убедитесь, что у вас установлены последние версии драйверов, системных обновлений и исправлений
Современная система и драйверы не только делают ваш компьютер более безопасным, но также могут решить проблемы с файлом C/C++/Objective-C Header Format. Возможно, файлы H работают правильно с обновленным программным обеспечением, которое устраняет некоторые системные ошибки.
Вы хотите помочь?
Если у Вас есть дополнительная информация о расширение файла H мы будем признательны, если Вы поделитесь ею с пользователями нашего сайта. Воспользуйтесь формуляром, находящимся здесь и отправьте нам свою информацию о файле H.
Часть 1. Вступление
Часть 2. Заголовочные файлы
Часть 3. Область видимости
…
Все мы при написании кода пользуемся правилами оформления кода. Иногда изобретаются свои правила, в других случаях используются готовые стайлгайды. Хотя все C++ программисты читают на английском легче, чем на родном, приятнее иметь руководство на последнем.
Эта статья является переводом части руководства Google по стилю в C++ на русский язык.
Исходная статья (fork на github), обновляемый перевод.
Встраиваемые (inline) функции
Определяйте функции как встраиваемые только когда они маленькие, например не более 10 строк.
Определение
Вы можете объявлять функции встраиваемыми и указать компилятору на возможность включать её напрямую в вызывающий код, помимо стандартного способа с вызовом функции.
Использование встраиваемых функций может генерировать более эффективный код, особенно когда функции маленькие. Используйте эту возможность для get/set функций, других коротких и критичных для производительности функций.
Чрезмерное использование встраиваемых функций может сделать программу медленнее. Также встраиваемые функции, в зависимости от размера её, могут как увеличить, так и уменьшить размер кода. Если это маленькие функции, то код может быть уменьшен. Если же функция большая, то размер кода может очень сильно вырасти. Учтите, что на современных процессорах более компактный код выполняется быстрее благодаря лучшему использованию кэша инструкций.
Хорошим правилом будет не делать функции встраиваемыми, если они превышают 10 строк кода. Избегайте делать встраиваемыми деструкторы, т.к. они неявно могут содержать много дополнительного кода: вызовы деструкторов переменных и базовых классов!
Ещё одно хорошее правило: обычно нет смысла делать встраиваемыми функции, в которых есть циклы или операции switch (кроме вырожденных случаев, когда цикл или другие операторы никогда не выполняются).
Важно понимать, что встраиваемая функция не обязательно будет скомпилирована в код именно так. Например, обычно виртуальные и рекурсивные функции компилируются со стандартным вызовом. Вообще, рекурсивные функции не должны объявляться встраиваемыми. Основная же причина делать встраиваемые виртуальные функции — разместить определение (код) в самом определении класса (для документирования поведения или удобства чтения) — часто используется для get/set функций.
Пример файла заголовка
В следующем примере показаны различные типы объявлений и определений, разрешенных в файле заголовка:
При создании проекта в Visual Studio в pch.h проект добавляется предварительно скомпилированный файл заголовка. (В Visual Studio 2017 и более ранних версиях файл был вызван stdafx.h .) Цель файла — ускорить процесс сборки. Здесь следует включить любые стабильные файлы заголовков, например заголовки стандартной библиотеки, такие как . Предкомпилированный заголовок компилируется только в том случае, если он или какие-либо содержащиеся в нем файлы были изменены. Если изменения вносятся только в исходный код проекта, при сборке будет пропущена компиляция для предкомпилированного заголовка.
Параметры компилятора для предварительно скомпилированных заголовков. /Y На страницах свойств проекта параметры находятся в разделе Configuration PropertiesC>/C++>Precompiled Headers. Можно не использовать предкомпилированные заголовки, а также указать имя файла заголовка и путь к выходному файлу.
Имена и Порядок включения (include)
Вставляйте заголовочные файлы в следующем порядке: парный файл (например, foo.h — foo.cc), системные файлы C, стандартная библиотека C++, другие библиотеки, файлы вашего проекта.
Все заголовочные файлы проекта должны указываться относительно директории исходных файлов проекта без использования таких UNIX псевдонимов как . (текущая директория) или .. (родительская директория). Например, google-awesome-project/src/base/logging.h должен включаться так:
Другой пример: если основная функция файлов dir/foo.cc иdir/foo_test.cc это реализация и тестирование кода, объявленного в dir2/foo2.h, то записывайте заголовочные файлы в следующем порядке:
- dir2/foo2.h.
- — Пустая строка
- Системные заголовочные файлы C (точнее: файлы с включением угловыми скобками с расширением .h), например , .
- — Пустая строка
- Заголовочные файлы стандартной библиотеки C++ (без расширения в файлах), например , .
- — Пустая строка
- Заголовочные .h файлы других библиотек.
- Файлы .h вашего проекта.
Такой порядок файлов позволяет выявить ошибки, когда в парном заголовочном файле (dir2/foo2.h) пропущены необходимые заголовочные файлы (системные и др.) и сборка соответствующих файлов dir/foo.cc или dir/foo_test.cc завершится ошибкой. Как результат, ошибка сразу же появится у разработчика, работающего с этими файлами (а не у другой команды, которая только использует внешнюю библиотеку).
Обычно парные файлы dir/foo.cc и dir2/foo2.h находятся в одной директории (например, base/basictypes_test.cc и base/basictypes.h), хотя это не обязательно.
Учтите, что заголовочные файлы C, такие как stddef.h обычно взаимозаменяемы соответствующими файлами C++ (cstddef). Можно использовать любой вариант, но лучше следовать стилю существующего кода.
Внутри каждой секции заголовочные файлы лучше всего перечислять в алфавитном порядке. Учтите, что ранее написанный код может не следовать этому правилу. По возможности (например, при исправлениях в файле), исправляйте порядок файлов на правильный.
Следует включать все заголовочные файлы, которые объявляют требуемые вам типы, за исключением случаев предварительного объявления. Если ваш код использует типы из bar.h, не полагайтесь на то, что другой файл foo.h включает bar.h и вы можете ограничиться включением только foo.h: включайте явно bar.h (кроме случаев, когда явно указано (возможно, в документации), что foo.h также выдаст вам типы из bar.h).
Например, список заголовочных файлов в google-awesome-project/src/foo/internal/fooserver.cc может выглядеть так:
Бывают случаи, когда требуется включение заголовочных файлов в зависимости от условий препроцессора (например, в зависимости от используемой ОС). Такое включение старайтесь делать как можно короче (локализованно) и размещать после других заголовочных файлов. Например:
Имена программных элементов, таких как переменные, функции, классы и т. д., должны быть объявлены до их использования. Например, вы не можете просто написать x = 42 без первого объявления "x".
Объявление указывает компилятору, является ли элемент элементом int , функцией double , а class также какой-либо другой вещью. Кроме того, каждое имя должно быть объявлено (прямо или косвенно) в каждом CPP-файле, в котором он используется. При компиляции программы каждый CPP-файл компилируется независимо в единицу компиляции. Компилятор не знает, какие имена объявляются в других единицах компиляции. Это означает, что если вы определяете класс или функцию или глобальную переменную, необходимо предоставить объявление этой вещи в каждом дополнительном CPP-файле, который использует его. Каждое объявление этой вещи должно быть точно идентичным во всех файлах. Небольшое несоответствие приведет к ошибкам или непреднамеренное поведение, когда компоновщик пытается объединить все блоки компиляции в одну программу.
В Visual Studio 2019 г. функция модулей C++20 появилась как улучшение и итоговая замена файлов заголовков. Дополнительные сведения см. в разделе "Обзор модулей" в C++.
Правила согласованности для /Yc и /Yu
При использовании предварительно скомпилированного заголовка, созданного с помощью /Yc или /Yu , компилятор сравнивает текущую среду компиляции с той, которая существовала при создании PCH-файла. Не забудьте указать среду, соответствующую предыдущей (с помощью параметров компилятора, прагм и т. д.) для текущей компиляции. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. В следующих разделах объясняются требования к согласованности для предкомпилированных заголовков.
Программы, обслуживающие файл H
Windows
MAC OS
Linux
Updated: 06/04/2020
Включение охранников
Правила согласованности для использования предварительно скомпилированных заголовков для каждого файла
Параметр /Yu компилятора позволяет указать, какой PCH-файл следует использовать.
При использовании PCH-файла компилятор предполагает ту же среду компиляции (которая использует согласованные параметры компилятора, pragmas и т. д.), которая действует при создании PCH-файла, если не указано иное. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. Требования к согласованности для файлов PCH описаны в следующих разделах.
Согласованность pragma
Pragmas, обрабатываемый во время создания PCH-файла, обычно влияет на файл, с которым позже используется PCH-файл. message И comment pragmas не влияют на оставшуюся часть компиляции.
Эти прагмы влияют только на код в PCH-файле; Они не влияют на код, который позже использует PCH-файл:
Эти прагмы сохраняются как часть предкомпилированного заголовка и влияют на оставшуюся часть компиляции, использующую предкомпилированный заголовок:
alloc_text
auto_inline
check_stack
code_seg
data_seg
function
include_alias
init_seg
inline_depth
inline_recursion
intrinsic
optimize
pack
pointers_to_members
setlocale
vtordisp
warning
Пример кода для PCH
Следующие исходные файлы используются в файле makefile, описанном в PCH-файлах в процессе сборки и образце файла makefile для PCH. Комментарии содержат важную информацию.
Файлы, которые содержат расширение .H, обычно являются заголовочными файлами, используемыми с языками программирования C ++ или C. .H файлы называются «заголовочными файлами» программистами. Они могут состоять из определений внешних переменных, прототипов функций и констант.
Заголовочные файлы в основном являются частью файлов исходного кода, которые требуются для использования функций или констант, определенных в заголовке. Например, если вы определяете текстовую строку, в которой название вашей компании является заголовочным файлом, вы можете использовать эту константу везде, где хотите отобразить, или же вы можете использовать название компании в исходном коде. Если вы хотите изменить имя позже, вам просто нужно сделать это из заголовка и перекомпилировать программу, чтобы сделать ее эффективной.
Программы, которые поддерживают H расширение файла
Ниже вы найдете указатель программ, которые можно использовать для открытия файлов H , разделенных на категории 3 в соответствии с поддерживаемой системной платформой. H файлы можно встретить на всех системных платформах, включая мобильные, но нет гарантии, что каждый из них будет должным образом поддерживать такие файлы.
PCH-файлы в процессе сборки
База кода проекта программного обеспечения часто содержится в нескольких исходных файлах C или C++, файлах объектов, библиотеках и файлах заголовков. Как правило, файл makefile координирует объединение этих элементов в исполняемый файл. На следующем рисунке показана структура файла makefile, использующего файл предкомпилированного заголовка. Имена макросов NMAKE и имена файлов на этой схеме согласуются с именами в примере кода, приведенного в примере файла makefile для PCH и примера кода для PCH.
На рисунке для отображения последовательности процесса сборки используются три схематических элемента. Прямоугольники представляют каждый файл или макрос; три макроса представляют один или несколько файлов. Затененные области представляют каждое действие компиляции или компоновки. Стрелки показывают, какие файлы и макросы объединяются во время процесса компиляции или компоновки.
Структура файла makefile, использующего файл предкомпилированного заголовка
Начиная с верхней части схемы и BOUNDRY являются макросами NMAKE, STABLEHDRS в которых список файлов, скорее всего, не требует перекомпиляции. Эти файлы компилируются с помощью командной строки
CL /c /W3 /Yc$(BOUNDRY) applib.cpp myapp.cpp
только в том случае, если файл предкомпилированного заголовка ( STABLE.pch ) не существует или если вы вносите изменения в файлы, перечисленные в двух макросах. В любом случае файл предкомпилированного заголовка будет содержать код только из файлов, перечисленных в STABLEHDRS макросе. Вывод списка последнего файла, предварительно скомпилированного в BOUNDRY макросе.
Файлы, перечисленные в этих макросах, могут быть файлами заголовков или файлами исходного кода C или C++. (Один PCH-файл нельзя использовать с источниками C и C++.) Макрос можно использовать для остановки hdrstop предварительной компиляции в какой-то момент в BOUNDRY файле. Дополнительные сведения см. в разделе hdrstop .
Далее на схеме представлен код поддержки, APPLIB.obj используемый в окончательном приложении. Он создается из APPLIB.cpp файлов, перечисленных в UNSTABLEHDRS макросе, и предварительно скомпилированного кода из предкомпилированного заголовка.
MYAPP.obj представляет конечное приложение. Он создается из MYAPP.cpp файлов, перечисленных в UNSTABLEHDRS макросе, и предварительно скомпилированного кода из предкомпилированного заголовка.
Наконец, исполняемый файл ( MYAPP.EXE ) создается путем связывания файлов, перечисленных в OBJS макросе ( APPLIB.obj и MYAPP.obj ).
Как открыть файл H ?
Отсутствие возможности открывать файлы с расширением H может иметь различное происхождение. К счастью, наиболее распространенные проблемы с файлами H могут быть решены без глубоких знаний в области ИТ, а главное, за считанные минуты. Приведенный ниже список проведет вас через процесс решения возникшей проблемы.
Шаг 1. Получить Microsoft Visual Studio
Наиболее распространенной причиной таких проблем является отсутствие соответствующих приложений, поддерживающих файлы H , установленные в системе. Этот легкий. Выберите Microsoft Visual Studio или одну из рекомендованных программ (например, Borland C++, Eclipse IDE, Dev-C++) и загрузите ее из соответствующего источника и установите в своей системе. Выше вы найдете полный список программ, которые поддерживают H файлы, классифицированные в соответствии с системными платформами, для которых они доступны. Если вы хотите загрузить установщик Microsoft Visual Studio наиболее безопасным способом, мы рекомендуем вам посетить сайт Microsoft Corporation и загрузить его из официальных репозиториев.
Шаг 2. Убедитесь, что у вас установлена последняя версия Microsoft Visual Studio
Вы по-прежнему не можете получить доступ к файлам H , хотя Microsoft Visual Studio установлен в вашей системе? Убедитесь, что программное обеспечение обновлено. Может также случиться, что создатели программного обеспечения, обновляя свои приложения, добавляют совместимость с другими, более новыми форматами файлов. Если у вас установлена более старая версия Microsoft Visual Studio, она может не поддерживать формат H . Все форматы файлов, которые прекрасно обрабатывались предыдущими версиями данной программы, также должны быть открыты с помощью Microsoft Visual Studio.
Шаг 3. Свяжите файлы C/C++/Objective-C Header Format с Microsoft Visual Studio
Если у вас установлена последняя версия Microsoft Visual Studio и проблема сохраняется, выберите ее в качестве программы по умолчанию, которая будет использоваться для управления H на вашем устройстве. Следующий шаг не должен создавать проблем. Процедура проста и в значительной степени не зависит от системы
Процедура изменения программы по умолчанию в Windows
- Нажатие правой кнопки мыши на H откроет меню, из которого вы должны выбрать опцию Открыть с помощью
- Далее выберите опцию Выбрать другое приложение а затем с помощью Еще приложения откройте список доступных приложений.
- Наконец, выберите Найти другое приложение на этом. , укажите папку, в которой установлен Microsoft Visual Studio, установите флажок Всегда использовать это приложение для открытия H файлы свой выбор, нажав кнопку ОК
Процедура изменения программы по умолчанию в Mac OS
Шаг 4. Убедитесь, что файл H заполнен и не содержит ошибок
Вы внимательно следили за шагами, перечисленными в пунктах 1-3, но проблема все еще присутствует? Вы должны проверить, является ли файл правильным H файлом. Отсутствие доступа к файлу может быть связано с различными проблемами.
1. Убедитесь, что H не заражен компьютерным вирусом
Если файл заражен, вредоносная программа, находящаяся в файле H , препятствует попыткам открыть его. Сканируйте файл H и ваш компьютер на наличие вредоносных программ или вирусов. Если файл H действительно заражен, следуйте инструкциям ниже.
2. Убедитесь, что структура файла H не повреждена
Если вы получили проблемный файл H от третьего лица, попросите его предоставить вам еще одну копию. Возможно, файл был ошибочно скопирован, а данные потеряли целостность, что исключает доступ к файлу. При загрузке файла с расширением H из Интернета может произойти ошибка, приводящая к неполному файлу. Попробуйте загрузить файл еще раз.
3. Проверьте, есть ли у вашей учетной записи административные права
Иногда для доступа к файлам пользователю необходимы права администратора. Выйдите из своей текущей учетной записи и войдите в учетную запись с достаточными правами доступа. Затем откройте файл C/C++/Objective-C Header Format.
4. Проверьте, может ли ваша система обрабатывать Microsoft Visual Studio
Если в системе недостаточно ресурсов для открытия файлов H , попробуйте закрыть все запущенные в данный момент приложения и повторите попытку.
5. Убедитесь, что у вас установлены последние версии драйверов, системных обновлений и исправлений
Современная система и драйверы не только делают ваш компьютер более безопасным, но также могут решить проблемы с файлом C/C++/Objective-C Header Format. Возможно, файлы H работают правильно с обновленным программным обеспечением, которое устраняет некоторые системные ошибки.
Вы хотите помочь?
Если у Вас есть дополнительная информация о расширение файла H мы будем признательны, если Вы поделитесь ею с пользователями нашего сайта. Воспользуйтесь формуляром, находящимся здесь и отправьте нам свою информацию о файле H .
Предварительно скомпилированные правила согласованности заголовков
Так как PCH-файлы содержат сведения о среде компьютера и адресе памяти о программе, следует использовать только PCH-файл на компьютере, на котором он был создан.
Согласованность параметров компилятора
В таблице ниже перечислены параметры компилятора, которые могут вызвать предупреждение о несогласованности при использовании предкомпилированного заголовка.
Параметр | name | Правило |
---|---|---|
/D | Определение констант и макросов | Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Состояние определенных констант не проверяется. Однако непредсказуемые результаты могут возникнуть, если файлы зависят от значений измененных констант. |
/E либо /EP | Копирование выходных данных препроцессора в стандартный вывод | Предварительно скомпилированные заголовки не работают с параметром или /EP параметром /E . |
/Fr либо /FR | Создание сведений о браузере исходного кода Майкрософт | Чтобы параметры /Fr /FR были допустимыми с параметром /Yu , они также должны быть введены в действие при создании предварительно скомпилированного заголовка. При последующих компиляциях, использующих предкомпилированный заголовок, также создаются сведения о браузере исходного кода. Сведения о браузере помещаются в один .sbr файл и ссылаются на другие файлы так же, как и сведения CodeView. Невозможно переопределить размещение сведений о исходном браузере. |
/GA , /GD , /GE , /Gw или /GW | Параметры протокола Windows | Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Если эти параметры различаются, выдается предупреждение. |
/Zi | Создание полной отладочной информации | Если при создании предкомпилированного заголовка этот параметр включен, последующие компиляции, использующие предварительную компиляцию, могут использовать отладочную информацию. Если /Zi не действует при создании предварительно скомпилированного заголовка, последующие компиляции, использующие предварительную компиляцию, и /Zi параметр активирует предупреждение. Сведения об отладке помещаются в текущий файл объекта, а локальные символы, определенные в предварительно скомпилированных заголовках, недоступны отладчику. |
Средство предварительно откомпилированных заголовков предназначено для использования только в исходных файлах C и C++.
Использование предварительно скомпилированных заголовков в проекте
В предыдущих разделах представлен обзор предкомпилированных заголовков: /Yc и /Yu, параметра /FP и прагмы hdrstop. В этом разделе описывается метод использования в проекте параметров заголовков, предкомпилированных вручную. В конце раздела приводится пример файла makefile и кода, который управляет им.
Для другого подхода к использованию параметров предварительно скомпилированного заголовка вручную в проекте изучите один из файлов makefile, расположенных в MFC\SRC каталоге, созданном во время настройки по умолчанию Visual Studio. Эти файлы makefile имеют аналогичный подход, представленный в этом разделе. Они делают больший доступ к макросам программы технического обслуживания (NMAKE) и обеспечивают более широкий контроль над процессом сборки.
Настраиваемый предварительно скомпилированный код
Для больших проектов, для которых требуется значительное время, может потребоваться создать настраиваемые предварительно скомпилированные файлы. Компиляторы Microsoft C и C++ содержат параметры для предварительной компиляции любого кода C или C++, включая встроенный код. С помощью этой функции производительности можно скомпилировать стабильный текст кода, сохранить скомпилированное состояние кода в файле и во время последующих компиляций объединить предварительно скомпилированный код с кодом, который все еще находится в стадии разработки. Каждая более поздняя компиляция выполняется быстрее, так как стабильный код не требует повторной компиляции.
Программы, обслуживающие файл H
Windows
MAC OS
Linux
Updated: 06/04/2020
C 7.0-compatible ( /Z7 )
Если этот параметр действует при создании PCH-файла, последующие компиляции, использующие PCH-файл, могут использовать сведения об отладке.
Если параметр C 7.0-Compatible ( /Z7 ) не действует при создании PCH-файла, последующие компиляции, использующие PCH-файл и /Z7 запускающие предупреждение. Сведения об отладке помещаются в текущий .obj файл, а локальные символы, определенные в PCH-файле, недоступны отладчику.
Программы, обслуживающие файл H
Windows
MAC OS
Linux
Updated: 06/04/2020
Согласованность исходного файла
При указании параметра Use Precompiled Header File ( /Yu ) компилятор игнорирует все директивы препроцессора (включая pragmas), которые отображаются в исходном коде, который будет предварительно скомпилирован. Компиляция, указанная такими директивами препроцессора, должна совпадать с компиляцией, используемой для параметра Create Precompiled Header File () (Файл заголовка). /Yc
Что нужно поместить в файл заголовка
Так как файл заголовка может быть включен несколькими файлами, он не может содержать определения, которые могут создавать несколько определений одного и того же имени. Следующие действия не допускаются или считаются очень плохой практикой.
- встроенные определения типов в пространстве имен или глобальной области
- Определения функций, отличных от встроенных
- Определения переменных, отличных от const
- агрегатные определения
- безымянные пространства имен
- Директивы using
using Использование директивы не обязательно приведет к ошибке, но может вызвать проблему, так как она добавляет пространство имен в область в каждом CPP-файле, который прямо или косвенно включает этот заголовок.
Блокировка от повторного включения
Для гарантии уникальности, используйте компоненты полного пути к файлу в дереве проекта. Например, файл foo/src/bar/baz.h в проекте foo может иметь следующую блокировку:
Предварительное объявление
Определение
«Предварительное объявление» — декларация класса, функции, шаблона без соответствующего определения.
Два варианта для предварительной компиляции кода
Вы можете предварительно скомпилировать любой код C или C++; Вы не ограничиваетесь предварительной компиляцией только файлов заголовков.
Для предварительной компиляции требуется планирование, но при предварительной компиляции исходного кода, отличного от простых файлов заголовков, обеспечивается значительно более быстрая компиляция.
Предварительная компиляция кода рекомендуется, когда известно, что исходные файлы используют общие наборы файлов заголовков, но не содержат их в том же порядке, или если требуется включить исходный код в предварительную компиляцию.
Параметры предварительно скомпилированного заголовка: /Yc (создать файл предварительно скомпилированного заголовка) и /Yu (использовать файл предварительно скомпилированного заголовка).) Используется /Yc для создания предварительно скомпилированного заголовка. При использовании с необязательным hdrstop pragma /Yc позволяет предварительно скомпилировать файлы заголовков и исходный код. Выберите /Yu для использования существующего предварительно скомпилированного заголовка в существующей компиляции. С параметрами /Yc и /Yu параметрами можно также /Fp указать альтернативное имя предкомпилированного заголовка.
Справочные статьи о параметрах /Yu компилятора и /Yc о том, как получить доступ к этим функциям в среде разработки.
Независимые заголовочные файлы
Заголовочные файлы должны быть самодостаточными (в плане компиляции) и иметь расширение .h. Другие файлы (не заголовочные), предназначенные для включения в код, должны быть с расширением .inc и использоваться в паре с включающим кодом.
Все заголовочные файлы должны быть самодостаточыми. Пользователи и инструменты разработки не должны зависеть от специальных зависимостей при использовании заголовочного файла. Заголовочный файл должен иметь блокировку от повторного включения и включать все необходимые файлы.
Предпочтительно размещать определения для шаблонов и inline-функций в одном файле с их декларациями. И эти определения должны быть включены (include) в каждый .cc файл, использующий их, иначе могут быть ошибки линковки на некоторых конфигурациях сборки. Если же декларации и определения находятся в разных файлах, включение одного должно подключать другой. Не выделяйте определения в отдельные заголовочные файлы (-inl.h). Раньше такая практика была очень популярна, сейчас это нежелательно.
Как исключение, если из шаблона создаются все доступные варианты шаблонных аргументов или если шаблон реализует функционал, используемый только одним классом — тогда допустимо определять шаблон в одном (и только одном) .cc файле, в котором этот шаблон и используется.
Возможны редкие ситуации, когда заголовочный файл не самодостаточный. Это может происходить, когда файл подключается в нестандартном месте, например в середине другого файла. В этом случае может отсутствовать блокировка от повторного включения, и дополнительные заголовочные файлы также могут не подключаться. Именуйте такие файлы расширением .inc. Используйте их парой и старайтесь чтобы они максимально соответствовали общим требованиям.
Включение согласованности пути
PCH-файл не содержит сведения о пути включения заголовка, который был фактическим при его создании. При использовании PCH-файла компилятор всегда использует путь включения заголовка, указанный в текущей компиляции.
Пример
В следующем примере показан распространенный способ объявления класса и последующего использования его в другом исходном файле. Начнем с файла заголовка. my_class.h Он содержит определение класса, но обратите внимание, что определение является неполным; Функция-член do_something не определена:
В файле реализации можно использовать using оператор, чтобы избежать необходимости указывать все упоминания "my_class" или "cout" с "N::" или "std::". Не помещайте using инструкции в файлы заголовков!
После завершения компиляции каждого CPP-файла в OBJ-файлы он передает OBJ-файлы компоновщику. При слиянии файлов объектов компоновщик находит только одно определение для my_class; он находится в OBJ-файле, создаваемом для my_class.cpp, и сборка завершается успешно.
Пример файла makefile для PCH
В следующем файле makefile используются макросы и !IF структура команд управления , !ELSE !ENDIF которая упрощает адаптацию проекта.
STABLEHDRS Помимо макросов, UNSTABLEHDRS показанных на рисунке "Структура файла Makefile, использующего файл предкомпилированного заголовка" в PCH-файлах в процессе сборки, этот файл makefile предоставляет CLFLAGS макрос и LINKFLAGS макрос BOUNDRY . Эти макросы необходимо использовать для перечисления параметров компилятора и компоновщика, которые применяются при сборке отладочной или финальной версии исполняемого файла приложения. Существует также LIBS макрос, в котором перечислены библиотеки, необходимые для проекта.
Файл makefile также использует !IF , !ELSE !ENDIF чтобы определить, определен ли символ в командной DEBUG строке NMAKE:
Эта функция позволяет использовать один и тот же файл makefile во время разработки и для окончательных версий программы. Используется DEBUG=0 для окончательных версий. Следующие строки команды являются эквивалентными.
Когда следует предварительно скомпилировать исходный код
Предварительно скомпилированный код полезен во время цикла разработки, чтобы сократить время компиляции, особенно если:
Всегда используется большой текст кода, в который редко вносятся изменения.
Программа состоит из нескольких модулей, каждый из которых использует стандартный набор включаемых файлов, а также одни и те же параметры компиляции. В этом случае все включаемые файлы можно предварительно скомпилировать в один предкомпилированный заголовок.
Первая компиляция (которая создает предварительно скомпилированный файл заголовка) занимает немного больше времени, чем последующие компиляции. Последующие компиляции могут выполняться быстрее, включая предварительно скомпилированный код.
Можно предварительно скомпилировать программы C и C++. В программировании на C++ часто используется разделение сведений об интерфейсе класса на файлы заголовков. Впоследствии эти файлы заголовков можно будет включать в программы, использующие класс. Предварительная компиляция этих заголовков позволяет сократить время, затрачиваемое программой на компиляцию.
Несмотря на то, что для каждого исходного файла можно использовать только один предварительно скомпилированный заголовок ( .pch файл), в проекте можно использовать несколько .pch файлов.
Согласованность параметров компилятора
Следующие параметры компилятора могут вызвать предупреждение о несогласованности при использовании файла PCH:
Макросы, созданные с помощью параметра препроцессора ( /D ), должны совпадать между компиляцией, создающей PCH-файл и текущую компиляцию. Состояние определенных констант не проверяется, но непредсказуемые результаты могут произойти при изменении этих макросов.
PCH-файлы не работают с параметрами и /EP параметрами /E .
PCH-файлы должны создаваться с помощью параметра "Создать сведения о просмотре" ( /FR ) или параметра "Исключить локальные переменные() перед /Fr последующими компиляциями, которые используют PCH-файл, могут использовать эти параметры.
Читайте также: