Pch h что это

Содержание

Pch h что это

A precompiled header file will be searched for when #include is seen in the compilation. As it searches for the included file (see Search Path) the compiler looks for a precompiled header in each directory just before it looks for the include file in that directory. The name searched for is the name specified in the #include with `.gch’ appended. If the precompiled header file can’t be used, it is ignored.

Библиотека pch h за что отвечает

За ранее откомпилированные заглавия (англ. pre-compiled headers ) — в средах программирования на языках Си и Си++ — метод ускорить компиляцию программ за счёт подготовительной обработки так именуемых заголовочных файлов, которые содержат интерфейсы модулей и, согласно нормам данных языков программирования, подключаются к программке путём прямой вставки их текстов в тело основной программки при помощи специальной директивы препроцессора #include . Предкомпилированные заглавия сохраняются на диске в виде файлов во внутреннем формате компилятора и при повторных компиляциях проекта время на их обработку и подключение значительно сокращается.

Предпосылки [ править | править код ]

Язык программирования Си для подключения наружного модуля использовал заголовочные файлы. Это упрощает компилятор, и даёт некую упругость — и это работало в течение 20 лет, пока заглавия были маленькими, а файлов в проекте — не много. С укрупнением программных проектов время компиляции стало расти квадратично [1] — возрастает как количество единиц компиляции, так и количество заголовков, подключённых к каждой определенной единице. В особо больших проектах полная перекомпиляция занимает 10-ки минут и почаще производится во время ночной сборки, чем на рабочих местах программистов.

К тому же язык программирования Си относится к семейству LR(1), и потому компиляторы Си медлительнее, к примеру, Паскаля (который LL(1)) [ источник не указан 2313 дней ] .

Чтоб уменьшить время компиляции, и были разработаны предкомпилированные заглавия. Так как заголовочные файлы изменяются еще пореже файлов, содержащих код программки (а библиотечные — фактически никогда), разумным средством оптимизации оказалось делать подготовительную обработку заголовков, и преобразование их в файлы специального вида, которые при компиляции программки можно подключать, минуя 1-ые стадии компиляции. За счёт прекомпиляции заголовков полной обработке компилятором подвергаются только изменённые части программки. Вобщем, подготовительная компиляция заголовка помогает не всегда:

  1. При изменении хоть какого из предкомпилируемых заголовков перекомпилируется весь набор.
  2. При полной перекомпиляции выигрыш по времени выходит, когда один и тот же набор применяется как минимум в 2-ух единицах компиляции.

Читайте также: Ipad mini mf450rs a какое поколение

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

Реализации [ править | править код ]

Embarcadero C++ Builder [ править | править код ]

Предкомпилируется всё, что идёт до директивы #pragma hdrstop .

GCC [ править | править код ]

При компиляции h -файлов GCC автоматом подразумевает, что требуется делать предкомпилированный заголовок (или это можно указать через командную строчку, ключ -x ). Большая часть оболочек программирования (к примеру, Code::Blocks) позволяют указывать, какие файлы предкомпилировать. Стандартным решением будет «свалить» более применяемые, но изредка меняющиеся заглавия в один h -файл и подключать его самым первым.

Microsoft Visual C++ [ править | править код ]

Ситуация похожа на GCC. Visual C++ версии 6.0 и выше предкомпилирует заголовок со стандартным именованием — stdafx.h (это имя можно поменять опцией компилятора).

При компилировании этого кода:

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

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

Pch h что это

Закрыт по причине того, что не по теме участниками user7860670, 0xdb, aleksandr barakin, Эникейщик, Eugene Krivenja 21 янв в 16:21 .

Похоже, этот вопрос не соответствует теме веб-сайта. Те, кто, голосовал за его закрытие, указывали последующие предпосылки:

  • «Вопрос вызван неувязкой, которая больше не воспроизводится, либо опечаткой. Хотя похожие вопросы могут быть уместны на этом веб-сайте, решение для этого вопроса навряд ли поможет будущим гостям. Обычно реально избежать схожих вопросов написанием и исследованием малой программки для проигрывания препядствия до публикации вопроса.» – aleksandr barakin, Эникейщик, Eugene Krivenja
  • «Вопросы с просьбами посодействовать с отладкой («почему этот код не работает?») должны включать хотимое поведение, определенную делему либо ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.» – user7860670, 0xdb

Читайте также: Кабельный порошок от тараканов отзывы

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

using namespace std;
int main1()
<
int arr[3];
int num = 0;

for (int i = 0; i > arr[i];
for (int i = 0; i Попроси больше объяснений

Ответ

Проблема 1 ясная, вторая – сомнительная.

1. Главная функция программы. При условии, что вы дали основной файл программы.

int main1() – это что такое?)

Изменяйте на int main()

2. #include «pch.h» – проверяйте, есть ли у вас этот файл в директории с проектом(основным файлом). Возможно, компилятор не может его найти. Если вы пишите в IDE, статический анализатор кода поможет вам в этом.

Предкомпиляция *.h файлов в проектах C++ на VisualStudio

3?. Для корректной работы объектов потока ввода/вывода вам требуется подключенный заголовочный файл iostream. Наверное, он у вас подключен, просто редактор текста znanija скушал значение, которое передается в директиву.

Портирование проекта на GCC+Linux

Начал портировать код OpenGL проектов на Linux. Выбрал Eclipse CDT, по дефлоту под линуксом у меня gcc 4.2.1. О gcc наслышан как о компиляторе который очень хорошо следует стандарту. Но к нему есть большие претензии.

1) memcmp() возвращает -1 при несовпадении блоков и 1 при совпадении. Проверял поля структур в дебаге — всё верно, 1 при совпадении. Поправьте меня, но кажется memcmp() как strcmp() должны в данном случае возвращать 0? Или нужно использовать какой-то dependent token?

templatetypename T> class A < public: T x; >; templatetypename T> class B : public AT> < public: T y; B( ) < x = 0; y = 0; > >; int main( ) < Aint> a; Bint> b; return 0; >

Этот код не компилируется. Спасает this->a или если я правильно догадываюсь о стандарте С++, A::a.
Fucked C++ standart? Мне всю мат. библиотеку придётся корёжить!

templatetypename T> void Method( ) < vectorT> v; >
Pch h что это

Этот код не компилируется. Спасает typedef как подсмотрено в местном STL.
Fucked C++ standart или примочки gcc?

4)
Компилятор просто не видит один из токенов OpenGL. Он есть в хидере, причём компилируется соседний с ним же токен. А этот — не хочет. Правда он длинноват, GL_TRANSFORM_FEEDBACK_ и т. д. Вставил препроцессор и заменил числом из хидера. Таких проблем на MSC никогда не было.

5) Нельзя передавать в макрос меньше параметров, чем объявлено аргументов. MSC это разрешает, за что ему огромное спасибо. gcc ругается.
Ну да это я могу понять, хотя это самое большое разочарование.

6) -xc++ — это правильный способ указания precompiled header? Аналог #pragma hdrstop, или предкомпилированный заголовок в gcc никогда не расширяется?

#1
22:55, 20 окт 2008

1) очень сомнительно, если честно

2) google two-phase name lookup. Это С++.

#include vector> using namespace std; templatetypename T> void Method( ) < vectorT> v; >
g++.EXE (GCC) 3.4.2 (mingw-special) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Компилируется с -pedantic.

6) -xc++ — это всего лишь явное указание языка (без этого ключа файлы с расширением .c будут компплироваться как С, а не С++)

#2
23:55, 20 окт 2008

Zeux
1) Хорошо проверю дополнительно.
2) Это fucked C++. Я понимаю почему MS не следует стандарту а идёт навстречу программистам. Представь что у меня vec2 наследуется от vec. В vec объявлен компонент x, в vec2 — y. Мне придётся захламлять код кучей this-> чтобы эта конструкция заработала. Впрочем, эту проблему обойти можно небольшим хаком.
3) Попробую.
6) Понятно, неправильно разобрал «To create a precompiled header file, simply compile it as you would any other file, if necessary using the -x option to make the driver treat it as a C or C++ header file.» Как тогда указать, что нужно создать precompiled header? Я нашёл такое описание:

A precompiled header file will be searched for when #include is seen in the compilation. As it searches for the included file (see Search Path) the compiler looks for a precompiled header in each directory just before it looks for the include file in that directory. The name searched for is the name specified in the #include with `.gch’ appended. If the precompiled header file can’t be used, it is ignored.

Т. е. для pch.h я должен вручную создать в папке пустой фаил pch.h.gch тогда и компилятор распознает его как precompiled? Как-то размыто описано.

#3
0:50, 21 окт 2008

Джо
а g++ -o pch.h.gch pch.h не работает?

#4
14:02, 21 окт 2008

$tatic
пишет
g++: pch.h: No such file or directory
я тут погуглил, у многих была такая проблема. значит что-то делается неправильно.
может нужно писать мэйкфаил вручную?

#5
17:09, 21 окт 2008

Джо
компилятор gcc 4.3.1 из OpenSuSE 11.0:
2) не компилируется, спасает A::x, пробовал некоторые ключи совместимости — не помогло;
3) компилируется тупым g++ -c main.cpp безо всяких ключей;
4) не проверял в своей версии, но видимо баг конкретной версии;

6) значит делаешь неправильно. Я написал небольшой пример с файлами main.c, foobar.c, foobar.h и pch.h (инклюдящий stdio.h).
В директории проекта предкомпилировал pch.h командой

gcc pch.h

При всем этом gcc по дефлоту создаёт файл pch.h.gch (ключом -o естественно можно переназначить, но не имеет смысла). Затем я для чистоты эксперимента закомментировал инклюд в pch.h и все же зависящие от него main.c и foobar.c компилировались.
Если у тебя не находит файл, то проверь текущую директорию командой pwd или убедись в существовании файла pch.h 🙂

ЗЫ. Если хочешь — напиши минитесты к пунктам 1 и 4, а я проверю. Просто сейчас голова не тем занята 🙁

#6
20:04, 21 окт 2008

Джо
Дошли руки проверить 1)
Скомпилировал в линуксе пример из MSDN — всё естественно работает как следует: 0 при равенстве, 0 если первый блок больше второго. Как это и следует из стандарта. Так что это ты что-то путаешь.

#7
20:52, 21 окт 2008

$tatic
сделал в еклипсе тестовый проект

#ifndef PCH_H_
#define PCH_H_

#warning Pch compilation!

extern void print();

int main()
<
puts( «Hello world.» );
print();
return 0;
>

void print()
<
puts( «Hello world 2» );
>

открыл из папки терминал набрал gcc Pch.h — получил Pch.h.gch
но мне нужно чтобы я в эклипсе смог задать прекомпиляцию т к эти настройки должны сохраняться вместе с распространением проекта.
В конечном итоге всё равно запустил проект на компиляцию и получил три #warning Pch compilation! Т е предкопилированный заголовок реально не используется (хотя в проекте gch файл отображается)

#8
21:15, 21 окт 2008

Почему-то все всегда ругают GCC, который всё правильно имплементит, а не MSVC, который имплементит язык, значительно отличающийся от стандартного C++ 2003. Ну а пункт 1 ты просто недоисследовал, и поспешил обвинить рантайм в невозможных грехах.

#9
22:44, 21 окт 2008

Джо
с эклипсом мне работать не довелось, предполагаю, что он использует automake. Действительно, gcc в данном случае не захватывает gch-файл. Я не понял пока причину этого.
Если собирать «ручками», то всё выполняется как положено:

> g++ -c Pch.h Pch.h:6:2: warning: #warning Pch compilation! > g++ -c Main.cpp > g++ -c Other.cpp > g++ -o test Main.o Other.o > ./test Hello world. Hello world 2

Необходимость файла Pch.cpp, однако, мне непонятна. Видимо это тяжкое наследие студии 🙂

Pch h что это

Похоже придётся либо писать мейкфайл с нуля (что достаточно некорректно), либо каким-то образом учить классический мейкфайл работать с прекомпилами, либо юзать другую систему сборки.

#10
23:47, 21 окт 2008

cppguru
Из-за этого мне пришлось захламить код мат. библиотеки кучей this->x вместо x. А там я считаю код должен быть очень чистым и ясным. Подозреваю MS специально отошла от этого пункта в стандарте чтобы программисты меньше матерились. Спасибо zeux за подсказку про two-phase name lookup я ещё как-нить почитаю подробнее про это и сделаю свои выводы о величине маразма разработчиков стандарта С++. Пункт номер три это тоже ещё тот геморрой. У меня кода такого вида мало, поэтому можно стерпеть. Зато у gсс-вского STL в коде куча локальных тайпдефов для обхода этого маразма. Коды STL это вообще говоря стыд исходя из убеждений написания читаемых программ, и пару сотен лишних typedef-ов делают его полным уродом окончательно — спасибо С++.

Делать нечего бояре, код желательно должен быть портируемым, и я сейчас этим занимаюсь. Но отношение к C++ у меня подпорчено (MSC С++ ранее очень нравился).

Пункт номер 5. Ну передаю я меньше параметров чем нужно — ну будь человеком, игнорируй остальные аргументы и не вставляй их в код. Нет, в стандарте нужно чётко прописать соотвествие кол-ва аргументов и параметров! У меня был специальный макрос __m() для решения проблем в code style-ом, теперь всё это вылетело в трубу 🙁

Что такое cpp и h и как их применять и использовать на c++

#11
23:56, 21 окт 2008

Сравнивалась структура, передаваемая по константной ссылке с локальной структурой метода:

void Method( const Struct& a ) < Struct b; . if ( memcmp( &a, &b, sizeof( Struct ) ) == 0) < . >>

Я в дебаге проверял поля структур — всё было идентично. Надо попробовать разные варианты. Как доберусь, отпишу.

Ну и precompiled headers. Студия тесно интегрирована с собственным компилятором, поэтому все опции к нему можно легко задать в свойствах проекта. IDE второго эшелона используют standalone компиляторы поэтому неудивительно что для того чтобы задать какую-то элементарную вещь надо перечитать тонну мануалов до того как найдёшь те три строчки что тебе нужны. Грустно. Я гуглил как мог но нигде не нашёл чёткого объяснения, как непосредственно их эклипса задать pch. Везде у людей No such file or directory хотя pch.h лежит рядом с файлом проекта.

#12
0:53, 22 окт 2008

> Я в дебаге проверял поля структур — всё было идентично. Надо попробовать разные варианты. Как доберусь, отпишу.
Равенство всех полей не означает равенство с т.з. memcmp — т.к. заполнение паддинга может быть разное. ну и если не дай боже vfptr и типы разные, то тоже.

Содержимое pch.h

Особенности while (pch != NULL)
Здравствуйте! Подскажите, почему пример ниже завершается ошибкой? Ведь если pch == NULL, то запись.

В чём разница между pch.h и stdfx.h
Недавно переустановил Windows и возникла проблема. Когда заново установил visuals studio,то пропал.

E1696 не удается открыть источник файл pch.h
Создаю консольное приложение в VS 2019, пишу ВЫШЕ исострима #include "pch.h" он выдаёт ошибку. В.

Почему Visual Studio требует библиотеку «pch.h»
Недавно начал учить с++, сначала писал в CodeBlocks, потом решил попробовать Visual Studio, все.

8720 / 4300 / 958
Регистрация: 15 Ноября 2014
Сообщений: 9,744
ezus
На какие файлы должны быть, рекомендуется или принято делать ссылки в pch.h

1.
содержимое которых изменяется редко, или вообще никогда.
например: заголовки стандартной библиотеки
или заголовки boost

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

1 2 3 4
// pch.hpp #define RELEASE_STABLE #include

гарантируется,
что mycomponent.hpp войдёт в компиляцию с включеным RELEASE_STABLE ,
независимо от содержимого файлов cpp

4.
трюк с макросами работает, так как на самом деле pch.hpp — это глобальная точка входа во все ед. трансляции.
поэтому в нём можно (и нужно) прописывать любые глобальные настройки компиляции.
например в pch.hpp удобно задавать глобальный уровень предупреждений компилятора.

5.
в pch.hpp так же можно добавлять код,
который нуждается в четко определенном порядке ед. трансляций.

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

поэтому, каким бы ни был общий порядок инициализации ед. транляции,
он всегда начнется с четко определенного порядка инициализации переменных,
которые были определены в pch.hpp

87844 / 49110 / 22898
Регистрация: 17 Июня 2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

пишет не удаётся открыть источник файл "pch.h" в Mircosoft Vusial studio делать не знаю.

Падает то не падает) APPCRASH StackHash PCH FROM ntdll
При работе приложения вызывается метод класса и с вероятностью 50/50 программа доживает до конца.

Доброго всем дня! Зачем нужно подключать файл "pch.h"? Что в нём находится?

Include «pch.h»
У меня в проекте 2 файла,Source.cpp и ConsoleApplication3.cpp. Но когда я запускаю,он просит.

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

  • Pch c что это

    Содержание Pch c что это По поводу PCH Перегрев северного моста в ноутбуке как снизить температуру fatal error C1010: Возможно, вы забыли добавить…

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

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

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

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