Share via


Pragma-Direktiven und das __Pragma-Schlüsselwort

Pragma-Direktiven geben computer- oder betriebssystemspezifische Compilerfunktionen an. Das __pragma-Schlüsselwort, das für den Microsoft-Compiler spezifisch ist, ermöglicht das Codieren von Pragma-Direktiven innerhalb von Makrodefinitionen.

#pragma token-string
__pragma(token-string)

Hinweise

Jede Implementierung von C und C++ unterstützt mehrere Funktionen, die auf dem Hostcomputer oder Betriebssystem einzigartig sind. Einige Programme beispielsweise müssen die Speicherbereiche genau kontrollieren, in denen Daten abgelegt werden, oder die Art und Weise steuern, wie bestimmte Funktionen Parameter empfangen. Die #pragma-Direktive bietet Compilern die Möglichkeit, computer- und betriebssystemspezifische Funktionen bereitzustellen und dabei die Gesamtkompatibilität mit anderen C- und C++-Programmiersprachen beizubehalten.

Pragmas sind definitionsgemäß computer- oder betriebssystemspezifisch, und sie sind normalerweise für jeden Compiler unterschiedlich. Pragmas können in bedingten Anweisungen verwendet werden, um neue Präprozessorfunktionen oder von der Implementierung abhängige Informationen für den Compiler bereitzustellen.

token-string ist eine Reihe von Zeichen, die einem bestimmten Compiler Anweisungen und Argumente gibt, falls vorhanden. Das Nummernzeichen (#) muss das erste Zeichen, das keine Leerstelle ist, in der Zeile sein, die das Pragma enthält. Leerzeichen können das Nummernzeichen und das Wort "Pragma" voneinander trennen. Nach #pragma schreiben Sie beliebigen Text, den das Konvertierungsprogramm als Vorverarbeitungstoken analysieren kann. Das Argument für #pragma unterliegt der Makroerweiterung.

Wenn der Compiler ein Pragma findet, das er nicht erkennt, gibt er eine Warnung aus und setzt die Kompilierung fort.

Die Microsoft C- und C++-Compiler erkennen die folgenden Pragmas:

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

message

omp

once

optimize

pack

pointers_to_members1

pop_macro

push_macro

region, endregion

runtime_checks

section

setlocale

strict_gs_check

unmanaged

vtordisp1

warning

1. Wird nur vom C++-Compiler unterstützt.

Pragmas und Compileroptionen

Einige Pragmas stellen die gleichen Funktionen wie Compileroptionen bereit. Wenn im Quellcode ein Pragma gefunden wird, überschreibt dieses das Verhalten, das mit der Compileroption angegeben wird. Wenn Sie beispielsweise /Zp8 angegeben haben, können Sie diese Compilereinstellung für bestimmte Codeabschnitte mit pack überschreiben:

cl /Zp8 ...

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

Das __pragma()-Schlüsselwort

Microsoft-spezifisch

Der Compiler unterstützt auch das __pragma-Schlüsselwort, das die gleichen Funktionen wie die #pragma-Direktive aufweist, aber in einer Makrodefinition inline verwendet werden kann. Die #pragma-Direktive kann nicht in einer Makrodefinition verwendet werden, da der Compiler das Nummernzeichen ('#') in der Direktive als Zeichenfolgenoperator (#) interpretiert.

Der folgende Beispielcode veranschaulicht die Verwendung des __pragma-Schlüsselworts in einem Makro. Dieser Code wurde dem mfcdual.h-Header im ACDUAL-Beispiel in den Beispielen für die COM-Unterstützung des Compilers entnommen:

#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; \

Ende Microsoft-spezifisch

Siehe auch

Referenz

C-Pragmas

C++-Schlüsselwörter

Weitere Ressourcen

C/C++-Präprozessorreferenz