Директивы Pragma и ключевое слово __Pragma

Директивы pragma определяют функции компилятора для конкретного компьютера или операционной системы. Ключевое слово __pragma, характерное для компилятора Microsoft, позволяет кодировать директивы pragma в определениях макросов.

#pragma token-string
__pragma(token-string)

Заметки

Каждая реализация C и C++ поддерживает некоторые функции, уникальные для хост-компьютера или операционной системы. Некоторые программы, например, должны осуществлять точный контроль над областями памяти, где размещаются данные, или контролировать способ получения параметров определенными функциями. Директивы #pragma предлагают каждому компилятору возможность предоставлять функции для конкретного компьютера и операционной системы, сохраняя общую совместимость с языками C и C++.

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

token-string — это последовательность символов, которые предоставляют определенную инструкцию компилятора и аргументы, если таковые имеются. Символ решетки (#) должен быть первым отличным от пробела символом в строке, которая содержит директиву pragma; символы пробела могут разделять знак числа и слово pragma. После #pragma введите любой текст, который преобразователь может проанализировать как токены предварительной обработки. Аргумент #pragma подлежит расширению макроса.

Если компилятор обнаруживает нераспознаваемую директиву pragma, он выдает предупреждение и продолжает компиляцию.

Компиляторы Microsoft C и C++ распознают следующие директивы pragma.

alloc_text

auto_inline

bss_seg

check_stack

code_seg

comment

component

conform1

const_seg

data_seg

deprecated

detect_mismatch

fenv_access

float_control

fp_contract

function

hdrstop

include_alias

init_seg1

inline_depth

inline_recursion

intrinsic

loop1

make_public

managed

сообщение

omp

once

optimize

pack

pointers_to_members1

pop_macro

push_macro

region, endregion

runtime_checks

section

setlocale

strict_gs_check

unmanaged

vtordisp1

warning

1. Поддерживается только компилятором C++.

Директивы pragma и параметры компилятора

Директивы pragma предоставляют те же функциональные возможности, что и параметры компилятора. При обнаружении директивы pragma в исходном коде она переопределяет поведение, заданное параметром компилятора. Например, если задан параметр /Zp8, можно переопределить этот параметр компилятора для определенных разделов кода с помощью pack.

cl /Zp8 ...

<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>

Ключевое слово __pragma()

Блок, относящийся только к системам Microsoft

Компилятор также поддерживает ключевое слово __pragma, которое имеет те же функциональные возможности, что и директива #pragma, но может использоваться внутри определения макроса. Директиву #pragma невозможно использовать в определении макроса, поскольку компилятор интерпретирует символ номера ("#") в директиве как строковый оператор (#).

В следующем примере кода показано, как использовать ключевое слово __pragma в макросе. Этот код — отрывок из заголовка mfcdual.h в образце ACDUAL, представленном в разделе "Примеры поддержки COM компилятором".

#define CATCH_ALL_DUAL \
CATCH(COleException, e) \
{ \
_hr = e->m_sc; \
} \
AND_CATCH_ALL(e) \
{ \
__pragma(warning(push)) \
__pragma(warning(disable:6246)) /*disable _ctlState prefast warning*/ \
AFX_MANAGE_STATE(pThis->m_pModuleState); \
__pragma(warning(pop)) \
_hr = DualHandleException(_riidSource, e); \
} \
END_CATCH_ALL \
return _hr; \

Завершение блока, относящегося только к системам Microsoft

См. также

Ссылки

Прагмы C

Ключевые слова в C++

Другие ресурсы

Справочник по препроцессору C/C++