Skip to content

Instantly share code, notes, and snippets.

Created August 26, 2017 21:35
Show Gist options
  • Save anonymous/ef52a665c3e61e31631a1166c9ec7c33 to your computer and use it in GitHub Desktop.
Save anonymous/ef52a665c3e61e31631a1166c9ec7c33 to your computer and use it in GitHub Desktop.
C stdafx h описание

C stdafx h описание



Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:. Используйте вашу учетную запись VKontakte для входа на сайт. Используйте вашу учетную запись на Facebook. Используйте вашу учетную запись Google для входа на сайт. Хостинг-провайдер даркнета подвергся кибератаке. Запомнить меня на этом компьютере Забыли свой пароль? Без этого инклудеса все бы компилилось, но! Я бы так не сказал. У меня этот хэдэр вобще редко бывает. Обязательный для моих сорцов - iostream - он у меня всегда включен. Может сорцы свои покажешь? Ты, что компилишь эксплоит? Но "для каждого проекта" этот хэдэр не обязателен. Не везет же мне, мозЖЖЕТ есть выход? Работает ли Lamer Death 2. Я запустил хорошо настроенный сервак, с портом пробовал и другие порты и попробовал подключиться сам к себе Так, ты не можешь откомплить даже этот сорц? А у тебя какой компилятор? Не знаешь -- не суйся Отвечаю сразу всем, и закрываю тему. Среди этих файлов имеются два, которые служать для генерации файла предкомпилированных заголовков precompiled headers. Для чего это сделано. Все это сделано для ускорения компиляции проектов и не более того. Из-за того, что объем части общих. Поэтому один раз генерится PCH-файл, а потом он PCH используется. Почему возникает ошибка "error looking precompiled header directive". В каждом source-файле, для которого стоит опция "use this precompiled header" include "stdafx. Как избавится от генерации PCH-файлов A: В свойствах проекта для файлов выставить "Not Using Precompiled Headers" или "Automatically Generate" Q: Где находятся эти опции A: Я настроил компиляцию DEBUG-версии на отказ использования PCH, но при компиляции RELEASE ошибка опять возникла. Реклама на сайте О проекте Контакты Copyright Экспорт статей RSS Мои параметры Карта сайта Информер история.


Файлы предварительно скомпилированных заголовков


Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. В незнакомой среде всё кажется странным и непонятным. Особенно новичков раздражает файл stdafx. Очень часто всё заканчивается тем, что новичок долгое время везде старательно отключает Precompiled Headers. Чтобы помочь людям разобраться что к чему, и была написана эта статья. Для чего нужны Precompiled Headers Precompiled headers предназначены для ускорения сборки проектов. На них сложно заметить выигрыш от precompiled headers. Что с ними, что без них, на глаз программа компилируется одинаковое время. Человек не видит для себя пользы от этого механизма и решает, что он для специфичных задач и ему никогда не понадобится. И иногда считает так многие годы. На самом деле, precompiled headers весьма полезная технология. Пользу от него можно заметить, даже если в проекте всего несколько десятков файлов. Особенно выигрыш становится заметен, если используются такие тяжёлые библиотеки как boost. В свою очередь, эти файлы включают другие заголовочные файлы и так далее. Всё это приводит к тому, что препроцессор в компиляторе вновь и вновь выполняет идентичную работу. Он должен читать одни и те же файлы, вставлять их друг в друга, выбирать ifdef ветки и подставлять значения макросов. Происходит колоссальное дублирование одних и тех же операций. Можно существенно сократить объем работы, которую должен проделать препроцессор при компиляции проекта. Идея в том, чтобы заранее препроцессировать группу файлов и затем просто подставлять готовый фрагмент текста. На самом деле, делается ещё ряд шагов. Можно хранить не просто текст, а более обработанную информацию. Но, например, можно хранить текст уже разбитый на лексемы. Это ещё больше ускорит процесс компиляции. Как работают Precompiled Headers Файл, который содержит precompiled headers, имеет расширение ". Имя файла обычно совпадает с названием проекта. Естественно, это и другие используемые имена можно изменить в настройках. Файл может быть весьма большим и зависит от того, как много заголовочных файлов в нём раскрыто. Например, в проекте PVS-Studio он занимает около 3 мегабайт. Этот ключ как раз и говорит компилятору, что нужно создать precompiled headers. Сюда нужно включить заголовочные файлы, которые будут заранее препроцессироваться. В качестве примера, вот файл stdafx. А что делать, если используются хотя и похожие, но разные наборы заголовочных файлов? Так сделать можно, но не нужно. Выигрыш от того, что при препроцессировании не надо читать множество файлов и вставлять их друг друга намного больше, чем потери на синтаксический анализ лишних фрагментов кода. Как использовать Precompiled Headers При создании нового проекта Wizard в Visual Studio создаёт два файла: Именно с помощью них и реализуется механизм precompiled headers. На самом деле, эти файлы могут называться, как угодно. Важно не название, а параметры компиляции в настройках проекта. Однако, в одном проекте может присутствовать несколько разных precompiled headers. Пока будем считать, что он у нас только один. Итак, если вы воспользовались wizard-ом, то у вас уже есть файлы stdafx. Плюс выставлены все необходимые ключи компиляции. Если в проекте не использовался механизм precompiled headers, то давайте рассмотрим, как его включить. Предлагаю следующую последовательность действий: Создаём и добавляем в проект файл stdafx. В дальнейшем, в него мы будем включать те заголовочные файлы, которые хотим заранее препроцессировать. В нём одна единственная строка: Во всех конфигурациях меняем настройки для файла stdafx. Вот мы и включили механизм precompiled headers. Однако, затем компиляция остановится из-за ошибок. Иначе всё равно возникнут ошибки компиляции. Если подумать, в этом есть логика. Этот текст всегда одинаков и ни от чего не зависит. А в этом файле возьмём и напишем: Теперь просто так нельзя взять и подставить заранее препроцессированный текст. Возможно, есть и другие. Дополнительно получится ревизия в системе контроля версий, где будет изменено огромное количество файлов. Ещё одно неудобство вызывают сторонние библиотеки, включаемые в проект в виде файлов с кодом. Править эти файлы нет смыла. Однако, если используется несколько мелких сторонних библиотек, это неудобно. Программист постоянно спотыкается об precompiled headers. Есть вариант, как использовать precompiled headers легко и просто. Способ подойдёт не везде и всегда, но мне он часто помогал. Компилятор сделает это сам. Что включать в stdafx. Хорошими кандидатами являются заголовочные файлы системных и сторонних библиотек. Включайте только те файлы, которые меняются очень-очень редко. Как правило, редко удаётся сделать все правки в h-файле с первого раза. Обычно требуется итерации. Согласитесь, раза полностью перекомпилировать весь проект — занятие неприятное. Плюс полная перекомпиляция потребуется всем вашим коллегам. Не увлекайтесь с неизменяемыми файлами. Включайте только то, что действительно часто используется. Там, где нужно, там и подключите этот заголовочный файл. Несколько Precompiled Headers Зачем в одном проекте может понадобиться несколько precompiled headers? Действительно, это нужно не часто. Но приведу пару примеров. Один должен получаться при компилировании C-файла xx. Иначе один файл будет перетирать другой. Одна часть проекта использует одну большую библиотеку, а другая часть другую большую библиотеку. Естественно, не стоит всем участкам кода знать про обе библиотеки. В неудачных библиотеках могут пересекаться имена каких-то сущностей. Логично сделать два precompiled headers и использовать их в разных участках программы. Всё это, конечно, требуется делать аккуратно, но ничего сложного в использовании двух precompiled headers нет. Типовые ошибки при использовании Precompiled Headers Прочитав внимательно материал выше, вы сможете понять и устранить ошибки, связанные с stdafx. Но давайте ещё раз пройдёмся по типовым ошибкам компиляции и разберём их причины. Повторенье — мать ученья. Cannot open precompiled header file: No such file or directory Вы пытаетесь скомпилировать файл, который использует precompiled header. Как правило, такая ситуация возникает у начинающих, которые захотели использовать precompiled headers для своего проекта. Сообщение говорит само за себя, если его прочитать. Это значит, что следует использовать precompiled header. Отключить для всех Си-файлов использование precompiled headers. Из-за precompiled header компилятор глючит Скорее всего, что-то сделано не так. Компилятор выдаст на первый взгляд странное сообщение об ошибке: В результате, нельзя будет использовать функции, объявленные в этом файле. Такое поведение очень сбивает программистов с толку. Запомните, компилятор — это один из наиболее редко глючащих инструментов. Они всё равно никак не участвуют в компиляции. Ещё один вариант — используйте Forced Included File. Из-за precompiled headers проект постоянно перекомпилируется целиком В stdafx. Или случайно включён автогенерируемый файл. В него должны входить только заголовочные файлы, которые не изменяются или изменяются крайне редко. Творится что-то непонятное Иногда может возникнуть ситуация, что вы поправили код, а ошибка не исчезает. Отладчик показывает непонятные вещи. В результате, подставляется старый код. Возможно, это происходило из-за каких-то сбоев, связанных с временем модификации файлов. Это ОЧЕНЬ редкая ситуация. Но она возможна и про неё надо знать. Я за многие годы программирования сталкивался с ней только раза. Помогает полная перекомпиляция проекта. Проект, использующий precompiled headers не удаётся проверить с помощью PVS-Studio Это наиболее частая ситуация, с которой к нам обращаются в поддержку. Подробности изложены в документации: Здесь опишу ситуацию кратко. Если решение solution компилируется, это вовсе не значит, что оно правильно устроено. Часто одно решение solution содержит множество проектов. В каждом проекте используются свои precompiled headers имеется свой stdafx. Возникают проблемы, когда начинают использовать файлы из соседнего проекта. Это удобно и так часто делается. И, какой из stdafx. Но раз программа компилируется — программисту везёт. В том, что solution, на самом деле, устроен не верно, можно убедиться, временно отключив precompiled headers. Сразу может вылезти масса интересных ошибок, и программист будет искренне удивляться, каким же чудом компилировался его проект. За подробностями вновь делаю отсылку к документации. Плюс, если что-то всё равно не ясно, мы подскажем в поддержке. Заключение Как вы увидели, ничего сложного в precompiled headers нет. Надеюсь, эта статья поможет устранить непонимание. Precompiled headers являются очень полезным механизмом, позволяющим существенно увеличить скорость компиляции проектов. Precompiled Headers , StdAfx. Добавить в закладки Метки лучше разделять запятой. Спасибо, за интересную статью. А сейчас и не сильно нужно. А почему Вы думаете что только в MS VS это есть? К примеру в 3. Нет, есть конечно, но только VS генерирует подобный файл при создании проекта. Делает это без объяснений и сильно преждевременно, вот и возникают у новичков траблы с компиляцией и не пониманием нафиг это чудо-юдо нужно. Если собирать хедеры как-нить так gcc -с xxx. Но мне всетаки кажется это преждевременной оптимизацией, которая все запутывает. Хотелось бы уточнить несколько вопросов касательно темы: Как по вашему, допустимо ли в stdafx. Как насчет запихнуть туда в stdafx. Нужно ли делать include guard , для stdafx. Как по-вашему, допустимо ли в stdafx. В большом думаю не стоит. В маленьких и средних, я думаю не будет беды в использовании using namespace для std и т. Вообще это на усмотрение разработчиков. Если они везде нужны, то можно и полезно. Например, у нас в stdafx. Потом он превратился в функцию, но смысл не поменялся. Функция также живёт в stdafx. Как-то никогда не задумывался над этим вопросом. По идеи, два раза stdafx. У нас на всякий случай написано " pragma once". Думаю, лишняя защита не повредит. Да, есть такие макросы. GCC и clang ругаются на " pragma once" в хедере, если он помечен как используемый для precompiled Так что лучше делать так: У вас есть qq:: Какой из foo должен выбрать компилятор? Помню у нас большой проект даже с precompiled headers собирался 45 минут, и я вот тут подумал: Что там делают, чтобы огромные проекты не собирались неделями? А там все хорошо, вы точно также можете использовать precompiled headers. А почему они должны собираться неделями? Что вы такое собираете? У нас в проекте Chromium для тестов собирается с особыми ключами, там порядка десяти тысяч файлов, сборка с нуля занимает порядка 10 минут, есть сколько-то precompiled headers в third party code, но с ними собирается меньше одного процента файлов. Правда есть одно но: Этак разика в три, если не в пять. Хотя машинки идентичны Dual Xeon CPU E, 64GiB RAM. Странно, что под винду ощутимо дольше сборка. Насколько помню, у Chromium просто гигантская кодовая база, если это все собирается 10 мин — просто чудо P. Собираем clang под Windows и под RedHat на одинаковых машинах — под виндой действительно дольше раза в два-три. По поверью, дело в реализации дисковой подсистемы, которая в Windows изначально интерактивной ОС оптимизирована под latency, а в Linux изначально пакетной ОС — под throughput. Это не чудо, это норма. А вот тормоза под Windows — это беда. Когда же Chrome собирается под Windows, то часто работой загружены процессоров, а остальные простаивают. Бог знает чем это чудо в этот момент занято: Замеры скорости сборки с и без Precompiled Headers будут? Очень громкое заявление, которое ничем не подкреплено. Если разместить проект в оперативной памяти RAMDisk , то чтение будет очень быстрым. Тем более, что в файл нужно подставить только один инлюд, а с Precompiled Headers будет вставлено очень много мегабайт текста, который нужно еще скомпилировать. При наличие большого кол-во проблем, связанных с Precompiled Headers возникает вопрос об их целесобразности. Разместите файлы на RAMDisk, и вот еще прибавка к скорости, не меняя исходников. А если нужно провести рефакторин, то нужно планировать и рефакторинг хидеров, так как они будут либо часто пересобираться либо вообще не нужны. Что опять же усложнит процесс разработки. Хм, а есть замеры скорости сборки с RAMDisk? О таком же поведении когда-то упоминали на StackOverflow… Операционные системы отлично кэшируют. Ускорял компиляцию другими методами. Статья же была на эту тему: Оптимизация сборки крупного проекта. Спасибо, отличная статья; добавлю в must read для своих подопечных учеников. Дата основания год Локация Тула Россия Сайт viva Introduction to IAe hardware paging https: Eric Battalio ebattalio manages communication, etc. Here are 7 hacks for debugging in VisualStudio. Everything you need to develop apps that users love. Write on e-mail - em pvs-studio. Channeling my inner advocate via ScionOfScorpio. Before it is posted, here is an experimental check of C code: Multiple Error Handling With The Optional Monad In cpp https: Check out my blog https: Статический анализ как часть процесса разработки Unreal Engine 4,2k 1. Интересные публикации Хабрахабр Geektimes. Ограничение скорости в nginx. W3C всё-таки одобрил стандарт DRM для HTML5 GT. Как я боролся с комарами. Личный опыт и тесты на себе GT. Neuralink — Будущее, которое сложно себе представить. Вы будете его частью GT. Как запутать аналитика — 5. Linux все еще не торт. Китай заблокирует VPN для частных лиц GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


https://gist.github.com/b52f59bdb12086b791a536be3d0cd455
https://gist.github.com/633b7ae9590cf11dc1eb026838217247
https://gist.github.com/c6df28c5632a20dd251655e71b33c4e5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment