Pch c что это

Содержание

Pch c что это

Прагма no_pch отменяет ключ -pch (precompiled headers) для определенного файла начального кода. Она показывает компилятору, что он не должен находить файл *.pch, и не должен генерировать его для обозначенного файла начального кода.

Pch c что это

Прагмы hdrstop, no_implicit_inclusion, no_pch, once и system_header помогают компилятору обрабатывать заголовочные файлы проекта (*.h), используя подготовительную компиляцию заголовков, что потенциально может уменьшить общее время компиляции проекта.

[#pragma hdrstop]

Прагма hdrstop pragma употребляется вкупе с ключом командной строчки -pch (precompiled header), см. врезку ниже. Функция -pch инструктирует компилятор находить файл подготовительной компиляции заголовков (файл с расширением *.pch), и если не вышло его отыскать, то этот файл будет сгенерирован для использования в следующей компиляции. Файл *.pch содержит снимок всего кода, который был скомпилирован до точки останова подготовительной компиляции (header stop point). Эта точка в начальном коде (либо в заголовочном файле) задается директивой #pragma hdrstop.

-pch

Функция командной строчки -pch (precompiled header) показывает компилятору автоматом генерировать и использовать файлы так именуемые файлы подготовительной компиляции заголовков (precompiled header files). Итог этой подготовительной компиляции сохраняется в файл с расширением *.pch и именованием, взятым из основного имени начального файла. По дефлоту все precompiled headers сохраняются в каталоге с именованием PCHRepository.

Следует подразумевать, что файлы precompiled header занимают дополнительное место на диске (каждый таковой файл может занимать несколько мб).

Примечание переводчика: опытным методом узнал, что функция -pch время от времени приводит к ошибке cc0219, которую поправить никак не удается:

cc0219: Catastrophic error: error while deleting file "PCHRepository\somefile.pch" 
1 catastrophic error detected in the compilation of ".\somefile.cpp". Compilation terminated. cc3089: fatal error: Compilation failed Tool failed with exit/exception code: 1. Build was unsuccessful.

Ошибка проявлялась на 64-битной системе Windows 7, но на другом компьютере с Windows XP 32 бита все компилировалось нормально.

По дефлоту точка header stop point (если #pragma hdrstop не употребляется) — 1-ая не обрабатываемая подготовительной компиляцией строчка в главном начальном коде. Директива #pragma hdrstop может употребляться установки header stop point в файле начального кода.

В последующем примере точка останова по дефлоту для подготовительной компиляции — начало декларации переменной i.

#include "standard_defs.h"
#include "common_data.h"
#include "frequently_changing_data.h"
int i;

Таковой вариант выбора точки останова подготовительной компиляции может быть нехорошим выбором, так как заголовочный файл frequently_changing_data.h может находится на стадии разработки и подвергаться частым модификациям. Это приведет к тому, что файл *.pch будет нередко генерироваться поновой, и выгода использования precompiled header пропадает. Прагма hdrstop может употребляться для того, чтоб избрать более подходящее место для точки header stop.

В последующем примере файл precompiled header не будет включать frequently_changing_data.h, так как он подключается после #pragma hdrstop. Потому precompiled header не надо будет создавать поновой всякий раз, когда был изменен frequently_changing_data.h.

#include "standard_defs.h"
#include "common_data.h"
#pragma hdrstop
#include "frequently_changing_data.h"
int i;

[#pragma no_implicit_inclusion]

При помощи функции -c++ (см. врезку ниже) для каждого файла заголовка (с расширением *.h либо без расширения), компилятор пытается подключить соответствующий файл *.c или .cpp. Это называется «неявное подключение» (implicit inclusion).

-c++

Эта опция (режим C++) указывает компилятору, что исходные файлы написаны в соответствии со стандартом ANSI/ISO языка C++, с добавлением расширений языка от Analog Devices.

В режиме по дефлоту допускаются все стандартные возможности C++, кроме обработки исключений (exception handling) и идентификаторов типа времени выполнения (run-time type identification), так как это приводит к слишком большим расходам ресурсов и обычно неприемлемо для встраиваемых приложений. Поддержка этих функций может быть разрешена при помощи опций командной строки -eh и -rtti.

-eh

Опция -eh (разрешить exception handling) указывает компилятору, что в коде C++ разрешены операторы обработки исключений try/catch, и есть возможность выбрасывания исключений (throw exceptions) и другие функции, связанные с ANSI/ISO standard C++ exceptions. Когда этот ключ разрешен, компилятор определяет макрос __EXCEPTIONS как 1.

Если опция -eh применяется при компиляции C-программ без опции -c++ (-c++ включает режим языка C++), то -eh указывает компилятору генерировать таблицы исключений, но не менять принятый язык. В данном случае макрос __EXCEPTIONS не определяется.

Опция –eh также заставляет компилятор определить __ADI_LIBEH__ во время стадии линковки, чтобы в ldf-файле [1] были бы активированы соответствующие секции, и программа могла быть слинкована с библиотекой, собранной с разрешением обработки исключений (exceptions enabled library).

Объектные файлы, созданные с разрешением исключений, могут быть линкованы с объектными файлами, где обработка исключений не включена. Однако исключения могут выброшены и пойманы, и выполнен код очистки, в модулях, скомпилированных с -eh. Если сделана попытка выбрасывания исключения в функции, не скомпилированной с -eh, то будет вызвана функция abort или функция, зарегистрированная при помощи set_terminate. Подробнее см. раздел помощи «Exceptions Tables Pragma» VisualDSP.

Для не многопоточных приложений для передачи данных исключений используется буфер, не возвращаемый в кучу на выходе из приложения (метка exit приложения). Это дает возможность избежать ненужного кода и не повлияет на поведение программы.

Опция -eh применяется, когда установлена галочка «C++ exceptions and RTTI» диалога свойств проекта VisualDSP++ (Compile -> Language Settings).

-no-eh

Опция -no-eh (запрет exception handling) указывает компилятору отменить разрешение обработки исключений языка C++ (ANSI/ISO C++ exception handling). Это режим по дефлоту для компилятора.

-rtti

Опция -rtti (разрешение идентификации типов во время выполнения кода, run-time type identification) указывает компилятору разрешить в программе использование выражений dynamic_cast и других функций ANSI/ISO C++ run-time type identification. Этот ключ также заставляет компилятор определить макрос __RTTI как 1.

Опция -rtti применяется, когда установлена галочка «C++ exceptions and RTTI» диалога свойств проекта VisualDSP++ (Compile -> Language Settings).

-no-rtti

Опция -no-rtti (запрет run-time type identification) указывает компилятору отменить разрешение поддержки dynamic_cast и других функций ANSI/ISO C++ run-time type identification. Это режим по дефлоту для компилятора.

Если строка #pragma no_implicit_inclusion помещена в заголовочный файл *.h (или файл без расширения), то компилятор не будет неявно подключать соответствующий файл *.c или .cpp при компиляции с опцией -c++. Это поведение влияет лишь на файл *.h (или файл без расширения), в каком есть строка #pragma no_implicit_inclusion, и соответствующие файлы *.c или *.cpp.

Например, если есть файл t.c, содержащий

Pch c что это
#include "m.h" 

и файлы m.h и m.c оба пустые, то командная строка:

покажет следующие зависимости для t.c:

Если следующая строка добавлена в m.h:

#pragma no_implicit_inclusion 

то запуск компилятора с той же командой ( ccblkfn -c++ t.c -M ) не покажет m.c в списке зависимостей:

[#pragma no_pch]

Прагма no_pch отменяет ключ -pch (precompiled headers) для определенного файла исходного кода. Она указывает компилятору, что он не должен искать файл *.pch, и не должен генерировать его для указанного файла исходного кода.

[#pragma once]

Прагма once создана для замены набора директив #ifndef/#define/#endif. Это просто «синтаксический сахар», используемый для красоты и удобства.

Директива #pragma once должна находиться сначала заголовочного файла. Она говорит компилятору, что этот заголовочный файл написан таким макаром, что его однократное подключение дает тот же эффект, как и многократное подключение. Т. е., говоря по-русски, заголовочный файл с #pragma once должен подключаться в проекте только один раз, даже если директива #include этого файла встречается в почти всех модулях проекта. Например,

#pragma once
// Следующие обрамляющие директивы #ifndef/#define/#endif
// больше не нужны:
#ifndef FILE_H
#define FILE_H
. содержимое файла заголовка . 
#endif 

Примечание: в этом примере директиву #pragma once в действительности указывать необязательно, так как компилятор увидит директивы #ifndef, #define и #endif, и не будет повторно обрабатывать этот заголовок.

[#pragma system_header]

Прагма system_header pragma идентифицирует файл как файл, предоставленный системой программирования VisualDSP++. Компилятор VisualDSP++ использует эту информацию, чтобы помочь оптимизации использования предоставляемых библиотечных функций и inline-функций, которые определены этими файлами. Не используйте эту прагму в исходном коде пользовательского приложения.

[Ссылки]

По поводу PCH

Прошу перестать придумывать новые способы инклюдить PCH.H
Строка включения PCH.H должна быть первой в .CPP файле и должна выглядеть, как:

#include "pch.h"

Отключение его полностью не принимается. PCH используется другими разработчиками проекта, и ваш код БУДЕТ исправлен, потому в настройках прописано использование РСН, и иначе он не скомпилится.

Неверное написание «stdafx.h», «gb/pch.h» не принимается. Ваш код БУДЕТ исправлен, так как иначе он не скомпилится.

Если у вас не находит pch.h, и вы не используете проект CMake, будьте добры прописать папку gameboost/ и gameboost/gb/ в пути инклюдов. Если вы используете проект CMake — эти настройки уже сделаны, всё работает само собой.

#1
13:39, 14 фев 2011

pch превращает библиотеку независимых модулей в один тупой неюзабельный монолит. печально.

#2
13:41, 14 фев 2011

EvilSpirit
чёчё ??

нажал на кнопу.. бац и сразу запустилось..

не нужно инклюды прописывать.. Это ж только для cpp а не для h

#3
13:48, 14 фев 2011

ksacvet777
> Это ж только для cpp а не для h
80% инклюдов из pch нужны уже в .h

я не спорю, я констатирую. модули уже не такие модули. библиотека — уже не библиотека, где можно взять любую книгу по нужному вопросу, тебе в ней дают книгу с цепочкой на привязи, которую — как хочешь, так и реж.

#4
13:55, 14 фев 2011

EvilSpirit
Ну .. на крайняк потом можно ввести макрос .. например GB_USE_PCH .

Я делал так:
В файле ks_inc_c.h — подключение всех си либ.
В файле ks_inc_cpp.h — подключение всех си++ либ.

м.. не то чтобы всех.. просто основных . .самых самых.

И потом пишешь просто #include «ks_inc_cpp.h» и всё лишних строк нет.

Это не проблема можно поправить потом.

#5
14:14, 14 фев 2011

Блин, давайте сделаем правило, что я должен обязательно перед коммитом трижды кувыркнуться, иначе не скомпилится 🙂
Если у меня, допустим, код компилируестя безо всяких бустов и pch, то почему у кого-то не скомпилируется — объясните. Кажется одмины уже забывают, зачем вообще нужна либа и отрываются как хотят.

#6
14:24, 14 фев 2011

Zefick
> Блин, давайте сделаем правило,
А давайте сделаем правило, что каждый пишет как хочет, подключает что хочет, и проект не нужен вообще?
Давайте я накачаю за 15 мин разносортных либ из интернета, скажу вот вам новый геймбуст, компильте его как хотите.

Pch c что это

Идея сделать одинаково и удобно всем.
Чтоб компилилось одинаково с одними и теми же настройками. Для этого настроен CMake, пользуйтесь.
Не нравится CMake? Возьмите на себя обязанность постоянно обновлять проект студии и положите его в новую папку, например projects/ это означает все новые добавления и настройки должны в разумный срок попадать в этот проект, вашими усилиями. Вероятно все борцы против PCH откажутся 😉

PCH нужен для тех, кто компилит с включенным Boost.
Отключить его, не сломав не вижу возможности.

#7
14:41, 14 фев 2011

kvakvs
> Для этого настроен CMake, пользуйтесь.
Пользователям то же самое скажете? Мне зачем ваш CMake впёрся, если свои исходники я и без него могу скомпилировать? А чужие уж как-нибудь тоже запущу, если понадобится, но пока только смотреть и можно.

Перегрев северного моста в ноутбуке как снизить температуру

> Возьмите на себя обязанность постоянно обновлять проект студии
Какой студии? Я ей уже года два не пользуюсь. Что значит эта фраза?

#8
14:47, 14 фев 2011

Zefick
> > Для этого настроен CMake, пользуйтесь.
> Пользователям то же самое скажете? Мне зачем ваш CMake впёрся, если свои
> исходники я и без него могу скомпилировать? А чужие уж как-нибудь тоже запущу,
> если понадобится, но пока только смотреть и можно.
рукалицо.jpg
Не вижу никаких причин городить собственные солюшены и проекты.
«CMake generates native makefiles and workspaces that can be used in the compiler environment of your choice.»
Поддерживаются
Borland Makefiles
MSYS Makefiles
MinGW Makefiles
NMake Makefiles
NMake Makefiles JOM
Unix Makefiles
Visual Studio 10
Visual Studio 10 Win64
Visual Studio 6
Visual Studio 7
Visual Studio 7 .NET 2003
Visual Studio 8 2005
Visual Studio 8 2005 Win64
Visual Studio 9 2008
Visual Studio 9 2008 Win64
Watcom WMake
CodeBlocks — MinGW Makefiles
CodeBlocks — NMake Makefiles
CodeBlocks — Unix Makefiles
Eclipse CDT4 — MinGW Makefiles
Eclipse CDT4 — NMake Makefiles
Eclipse CDT4 — Unix Makefiles

Один раз сгенерил и пользуйся уже с новыми настройками.
Но я понимаю, надо сделать по своему, а потом устраивать срач с теми, кто старается сделать удобно для всех.

> > Возьмите на себя обязанность постоянно обновлять проект студии
> Какой студии? Я ей уже года два не пользуюсь. Что значит эта фраза?
Можно было в прошлом ответе написать чем все-таки именно и не ждать этого вопроса? Так чем все-таки?

#9
15:08, 14 фев 2011

Действительно для тех, кто не пользуется студией не помешало бы отключить PCH, но поскольку в файлы вписать #ifdef мы не можем (студия откажется компилить), идеальным на мой взгляд решением было бы сделать две подпапки pch/ и nopch/ и в одну положить то, что мы имеем сейчас, в другую специально подготовленные пустые файлы.

Кто не хочет PCH, просто прописывает в инклюд пути папку nopch/ с пустым файлом, остальные получают из CMake или прописывают вручную папку pch/

#10
15:11, 14 фев 2011

kvakvs
> Не вижу никаких причин городить собственные солюшены и проекты.
Ну хочу я сделать свой солюшн, что такого. Может у меня вообще свой мейкфайл, руками написанных, кому какое дело. Я же не заставляю никого им пользоваться, (в отличие от). Я исходники коммичу, а дальше пусть уже люди хоть в свои проекты под них делают, хоть в CMake вставляют. Объясните почему если не заинклюдить pch, то файл не скомпилируетя?

> Так чем все-таки?
Если это важно, то MinGW, но вообще мы же под любой компилятор вроде делаем?

#11
15:16, 14 фев 2011

Zefick
> Объясните почему если не заинклюдить pch, то файл не скомпилируетя?
В вижуал студии если для всех файлов включить Precompiled Headers, она откажется компилировать те, где этот заголовок не включается. Простого способа запретить это я не вижу, кроме указанного в #9. Без PCH работать тоже ОЧЕНЬ неудобно, включенный Boost ощутимо долго компилирует каждый файл без PCH. У кого буст отключен — поздравляю, но у кого-то ведь и включен?

Zefick
> Если это важно, то MinGW, но вообще мы же под любой компилятор вроде делаем?
Да, стараемся.
Поэтому я настроил CMake 🙂

#12
15:52, 14 фев 2011

Я голосую за gb/pch.h, объясняю почему.
Мы договорились писать инклуды GB как gb/. .h
Соответственно, если я отключу pch, #include «pch.h» не скомпилируется и выдаст ошибку, для того, чтобы ее не было, нужно будет еще дописывать в директории папку GB.
И gb/pch.h более наглядно указывает местоположение файла, что не какой то левый, а GB-ский.

#13
15:54, 14 фев 2011

-Eugene-
> Я голосую за gb/pch.h, объясняю почему.
Ну попробуй настрой секцию в CMakeLists.txt
if(MSVC)
там где настраиваются PCH
endif()

так, чтобы начало успешно компилиться в форме «gb/pch.h»
не сработает ведь 😉 я пробовал, честно.

#14
15:55, 14 фев 2011

непонятно, зачем общий проект для каждой либы?
одна папка — один проект, один(или больше) либ файлов
make.bat (или аналог), заходит в папку, компилит/собирает. пользователь компилит только то что ему нужно, или вообще из репозитория берет только то что ему нужно.
в PhyreEngine так сделано.

fatal error C1010: Возможно, вы забыли добавить директиву «#include «pch.h»» в источник [закрыт]

fatal error C1010: непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву «#include «pch.h»» в источник.

Почему так — непонятно. Все библиотеки подключил. (Работал в VS)

Отслеживать
задан 19 янв 2019 в 8:53
7 1 1 серебряный знак 2 2 бронзовых знака
Ну а в .cpp есть подключение файла?
19 янв 2019 в 8:58
19 янв 2019 в 9:22

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

19 янв 2019 в 10:54

ты как проект создавал? создавал пустой и добавлял файлы? Если да, то тогда создай проект консольное приложение и все там автоматически все будет

19 янв 2019 в 12:14

Вы что-то выдумываете или недоговариваете. При компиляции этого кода такой ошибки нет и быть не может.

19 янв 2019 в 14:45

1 ответ 1

Сортировка: Сброс на вариант по дефлоту

Если вы не используете предварительно скомпилированные заголовки в своем проекте, установите для свойства Создать / Использовать предварительно скомпилированные заголовки исходных файлов значение Не использовать предварительно скомпилированные заголовки. Чтобы установить этот параметр компилятора, выполните следующие действия:

  • На панели «Обозреватель решений» проекта щелкните правой кнопкой мыши имя проекта и выберите «Свойства».
  • На левой панели щелкните папку C / C ++.
  • Щелкните по узлу «Предварительно скомпилированные заголовки».
  • На правой панели щелкните «Создать / использовать предварительно
    скомпилированный заголовок», а затем нажмите «Не использовать
    предварительно скомпилированные заголовки».

Убедитесь, что вы случайно не удалили, не переименовали или не удалили файл заголовка (по дефлоту stdafx.h) из текущего проекта. Этот файл также должен быть включен перед любым другим кодом в ваших исходных файлах с использованием #include «stdafx.h». (Этот заголовочный файл указан как свойство проекта «Создать / использовать PCH через файл») Источник

Похожие статьи

  • Pch h что это

    Содержание Библиотека pch h за что отвечает Предпосылки [ править | править код ] Реализации [ править | править код ] Embarcadero C++ Builder [ править…

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Что будем искать? Например,Человек

Мы в социальных сетях