hdrstop pragma
Обеспечивает больше контроля над именами файлов предварительной компиляции и расположением, в котором сохраняется состояние компиляции.
Синтаксис
Замечания
Имя файла — это имя предварительно скомпилированного файла заголовка для использования или создания (в зависимости от того, задано /Yu или /Yc указано). Если имя файла не содержит спецификацию пути, предполагается, что предварительно скомпилированные файл заголовка будут находиться в том же каталоге, что и исходный файл.
Если файл C или C++ содержит hdrstop pragma файл, скомпилированный с /Yc помощью, компилятор сохраняет состояние компиляции до расположения pragma. Скомпилированное состояние любого кода, следующего за pragma ней, не сохраняется.
Используйте имя файла для имени предварительно скомпилированного файла заголовка, в котором сохраняется скомпилированное состояние. Пространство между hdrstop файлом и именем файла является необязательным. Имя файла, указанное hdrstop pragma в строке, и подлежит ограничениям любой строки C или C++. В частности, необходимо заключить его в кавычки и использовать escape-символ (обратная косая черта, \ ) для указания имен каталогов. Например:
#pragma hdrstop( "c:\\projects\\include\\myinc.pch" )
Имя предкомпилированного файла заголовка определяется в соответствии со следующим правилам в порядке приоритета.
- Аргумент параметра компилятора /Fp
- Аргумент имени файла #pragma hdrstop
- Базовое имя исходного файла с расширением PCH
Если ни один из /Yc параметров или /Yu hdrstop pragma имя файла не указан, базовое имя исходного файла используется в качестве базового имени предварительно скомпилированного файла заголовка.
Команды предварительной обработки также можно использовать для выполнения замены макроса.
#define INCLUDE_PATH "c:\\progra~1\\devstsu~1\\vc\\include\\" #define PCH_FNAME "PROG.PCH" . . . #pragma hdrstop( INCLUDE_PATH PCH_FNAME )
Следующие правила управляют размещением: hdrstop pragma
- Она должна находится за пределами любых объявлений или определений данных или функций.
- Она должна задаваться в файле исходного кода, а не заголовка.
Пример
#include // Include several files #include "myhdr.h" __inline Disp( char *szToDisplay ) // Define an inline function < // . // Some code to display string >#pragma hdrstop
В этом примере hdrstop pragma отображается после включения двух файлов и определена встроенная функция. Сначала это расположение может показаться нечетным размещением pragmaдля . Однако учитывайте, что использование параметров предварительной компиляции вручную и /Yc /Yu с hdrstop pragma помощью этого средства позволяет предварительно компилировать все исходные файлы или даже встроенный код. Компилятор Майкрософт не ограничивает предварительное компиляцию только объявлений данных.
Что делает #pragma hdrstop
If a C or C++ file contains a hdrstop pragma when compiled with either /YX or /Yc, the compiler saves the state of the compilation up to the location of the pragma. The compiled state of any code that follows the pragma is not saved.
Всё равно неясно для чего это нужно и нужно ли вообще.
Прошло более 5 лет
#1
20:14, 2 сен 2010
Собственно тоже сталкнулся с этим, Быдлер постоянно сует ее в чистых проектах, что делает сия директива? Я ее просто удаляю, но может она зачем-то нужна?
#2
20:27, 2 сен 2010
Типа PCH, тока не понятно, для чего так, если есть нормальные средства для этого.
#3
20:27, 2 сен 2010
MAMONT-92 [REBORN]
А ты загугли.
#4
20:28, 2 сен 2010
Ну на мсдне вроде все понятно написано, сохраняет все состояние компиляции до этой прагмы, если файл откомпилированного заголовка указан то он вступает в силу с только после этой прагмы, если не указан то берется дефолтный, опять же таки только после этой прагмы
#5
20:29, 2 сен 2010
кароче можно просто удалять и не волнует, так?
#6
20:29, 2 сен 2010
Wraith
> А ты загугли.
а я через гуголь и попал сюда.
#7
20:29, 2 сен 2010
MAMONT-92 [REBORN]
> кароче можно просто удалять и не волнует, так?
если стоит вначале, и выше только #include «. /precompiled.h» — Да
#8
10:57, 3 сен 2010
#pragma hdrstop — своеобразный аналог PCH — все заинклуденные хидеры до #pragma hdrstop будут прекомпилированы и закешены, если где еще в C/CPP файлах компилятор встретит ту же последовательность хидеров до #pragma hdrstop — то заюзается уже скомпиленый кеш.
- Sbtrn. Devil
- Постоялец
#9
12:20, 3 сен 2010
А в небыдлер-м$ $тудии с этой же целью заставляют инклудить stdafx.h, причём принудительно. Так-то!
#10
12:33, 3 сен 2010
Sbtrn. Devil
это был один из агрументов, почему ушел со студии, там без этой хрени ничего не компилилось.
#11
12:41, 3 сен 2010
MAMONT-92 [REBORN]
> это был один из агрументов, почему ушел со студии, там без этой хрени ничего не
> компилилось.
Бедняжка. Хоть не на линукс перешел?
Если тебя бесит то, что проект собирается быстрее, то можно отключить «юзинг прекомпаилед хиадерc» в настройках.
#12
12:43, 3 сен 2010
entryway
> Бедняжка. Хоть не на линукс перешел?
Линукс — это поделка собранная на коленке в туалете полная всевозможных костылей.
#13
12:52, 3 сен 2010
MAMONT-92 [REBORN]
> Sbtrn. Devil
> > А в небыдлер-м$ $тудии с этой же целью заставляют инклудить stdafx.h, причём принудительно. Так-то!
> это был один из агрументов, почему ушел со студии, там без этой хрени ничего не компилилось.
пф-пф-пф.
#14
12:59, 3 сен 2010
Sbtrn. Devil
> А в небыдлер-м$ $тудии с этой же целью заставляют инклудить stdafx.h, причём принудительно. Так-то!
Ну что за бред. Никто никого не заставляет, в чистом проекте вообще нет никаких stdafx.h. Я в каждом новом проекте сам создаю stdafx.h такой, какой мне нужен.
А если уж так хочется создать проект визардом и при этом убрать stdafx.h и при этом не хочется убирать галочку ответственную за это (нафига тока не ясно), то при желании парой кликов PCH отключается.
MAMONT-92 [REBORN]
> это был один из агрументов, почему ушел со студии, там без этой хрени ничего не компилилось.
Лол. Можно это просто не использовать.
Но так как эта вещь очень полезна, то не вижу смысла её не использовать.
#pragma
Директива #pragma определяется стандартом ANSI С для реализации директив, предоставляющих компилятору различные инструкции. Стандартный вид #pragma следующий:
где имя — это имя директивы #pragma. Borland определяет 14 директив #pragma:
argused
anon_struct
codeseg
comment
exit
hdrfile
hdrstop
inline
intrinsic
message
option
saveregs
startup
warn
Директива argused должна стоять перед функцией. Она используется для устранения предупреждений, если аргумент функции, перед которой стоит #pragma, не используется в теле функции.
Чтобы разрешить использовать анонимные структуры, укажите директиву anon_struct. С помощью директивы codeseg можно указать сегмент, класс или группу, используемую функцией.
Используя директиву comment, в выходной файл, например, в файл с расширением obj или ехе можно поместить комментарии.
Директива exit определяет одну или несколько функций, вызываемых при завершении программы. Директива startup определяет одну или несколько функций, вызываемых при запуске программы. Они имеют следующий вид:
#pragma exit имя_функции приоритет
#pragma startup имя_функции приоритет
Приоритет — это значение от 64 до 255 (значения от 0 до 63 зарезервированы). Приоритет определяет порядок вызова функций. Если приоритет не указан, то по умолчанию предполагается значение 100. Все функции, выполняющиеся в начале или конце программы, должны объявляться следующим образом:
void f(void);
Следующий пример определяет функцию start(), выполняющуюся в начале программы.
#include
void start(void);
#pragma startup start 65
int main(void)
printf(«In main\n»);
return 0;
>
void start (void)
printf(«In start\n»);
>
В результате работы программы на экране появится:
In start
In main
Как показывает данный пример, необходимо предоставить прототип функции до использования директивы #pragma.
С помощью директивы hdrfile можно определить имя файла, используемого для хранения пред- компилированных заголовочных файлов. Он имеет вид
#pragma hdrfile «имя_файла. csm»
где имя_файла — это имя файла (с расширением csm).
Директива hdrstop сообщает Borland С++ о необходимости остановить предкомпиляцию заголовочных файлов.
Также имеется директива inline, имеющая следующий вид:
Она сообщает компилятору, что программа содержит внутренний ассемблерный код. При создании самого быстрого кода компилятор должен знать, что в программе содержится ассемблерный код.
Используя директиву intrinsic, можно указать компилятору на необходимость подстановки кода функции вместо ее вызова. Директива имеет вид:
#pragma intrinsic имя_функции
где имя_функции — это имя функции, которую необходимо сделать внутренней.
Если выбрать опцию Inline Intrinsic Function в ИСР (интегрированной среде разработчика) или воспользоваться опцией -Oi при компиляции с помощью строчного компилятора, то Borland автоматически сделает внутренними следующие функции:
alloca memcpy stpcpy strcpy strncpy
fabs memset strcat strlen strnset
memchr rotl strchr strncat strrchr
memcmp rotr strcmp strncmp
Воспользовавшись директивой intrinsic, можно отменить функции, которые станут внутренними: #pragma intrinsic имя_функции
Директива message позволяет определить сообщение, выводимое в качестве предупреждения при компиляции программы. Например:
#include
#pragma message This will be displayed as a warning.
int main(void)
int i=10;
printf («This is i: %d\n», i);
#pragma message This is also displayed as a warning.
return 0;
>
При компиляции появятся два сообщения #pragma, выводящиеся в качестве предупреждений. При использовании ИСР они появятся в стандартном окне сообщений.
Директива option позволяет определить опции командной строки вместо того, чтобы данные опции явно указывать в командной строке. Она имеет следующий вид:
#pragma option список_опций
Например, следующая директива приводит к тому, что содержащая ее программа будет компилироваться в модели large:
#pragma option -ml
Следующие опции не могут использоваться с директивой option:
-В -с -D -е -Е -F -h
-l -М -о -Р -Q -S -Т
-U -V -X -Y
Для использования некоторых опций директива option должна стоять перед любыми объявлениями, включая прототипы функций. Поэтому имеет смысл помещать данную директиву самой первой.
Директива saveregs запрещает функции, объявленной как huge, изменять какие-либо регистры. Данная директива должна стоять перед функцией, и она влияет только на функцию, перед которой стоит.
Директива warn позволяет запретить или разрешить различные предупреждения. Она имеет вид:
#pragma warn установки
где установки — это опции для определения предупреждений.
Pragma hdrstop c что это
Рейтинг (т): 0
Использую Builder 6.0
Че-то я натворил, и мой Билдер теперь отказывается создавать файл предкомпияции(или как его там. )
Деректива #pragma hdrstop на месте
Обыскал все настройки, но мне это не помагло.
В чем тут может быть дело?
Добавлено 29.12.05, 18:14
Кстати, Билдер выдает:
[C++ Warning] Project1.cpp(4): W8058 Cannot create pre-compiled header: write failed
[C++ Warning] Unit1.cpp(4): W8058 Cannot create pre-compiled header: write failed