Pragma yönergeleri ve __pragma
ve _Pragma
anahtar sözcükleri
Pragma yönergeleri makineye özgü veya işletim sistemine özgü derleyici özelliklerini belirtir. ile #pragma
başlayan bir satır bir pragma yönerge belirtir. Microsoft'a özgü __pragma
anahtar sözcük, makro tanımları içinde yönergeleri kodlaymanızı pragma sağlar. C99'da kullanıma sunulan ve C++11 tarafından benimsenen standart _Pragma
ön işlemci işleci benzerdir.
Sözdizimi
#pragma
belirteç dizesi
__pragma(
belirteç dizesi)
önde gelen iki alt çizgi - Microsoft'a özgü uzantı
_Pragma(
dize değişmez değeri)
C99
Açıklamalar
C ve C++ uygulamalarının her biri konak makinesine veya işletim sistemine özgü bazı özellikleri destekler. Örneğin bazı programlar, verilerin bellekteki konumu üzerinde kesin denetim yapmalı veya belirli işlevlerin parametre alma şeklini denetlemelidir. Yönergeler, #pragma
her derleyici için makineye ve işletim sistemine özgü özellikler sunarken C ve C++ dilleri ile genel uyumluluğu sürdürmenin bir yolunu sunar.
Pragma yönergeleri makineye özgü veya işletim sistemine özgü tanımlar ve genellikle her derleyici için farklıdır. yeni pragma ön işlemci işlevselliği sağlamak için bir koşullu yönergede kullanılabilir. Ya da derleyiciye uygulama tanımlı bilgiler sağlamak için birini kullanın.
Belirteç dizesi, varsa belirli bir derleyici yönergesini ve bağımsız değişkenlerini temsil eden bir dizi karakterdir. Sayı işareti (#
), öğesini içeren pragmasatırdaki ilk boşluk olmayan karakter olmalıdır. Boşluk karakterleri sayı işaretini ve "pragma" sözcüğünü birbirinden ayırabilir. ardından #pragma
, çeviricinin önişlem belirteçleri olarak ayrıştırabileceği tüm metinleri yazın. bağımsız #pragma
değişkeni makro genişletmeye tabidir.
dize değişmez değeri girişidir _Pragma
. Dış tırnak işaretleri ve baştaki/sondaki boşluk kaldırılır. \"
ile "
değiştirilir ve \\
ile \
değiştirilir.
Derleyici tanımadığı bir pragma uyarı bulduğunda bir uyarı oluşturur ve derlemeye devam eder.
Microsoft C ve C++ derleyicileri aşağıdaki pragma yönergeleri tanır:
alloc_text
auto_inline
bss_seg
check_stack
code_seg
comment
component
conform
1
const_seg
data_seg
deprecated
1 Yalnızca C++ derleyicisi tarafından desteklenir.
Pragma yönergeleri ve derleyici seçenekleri
Bazı pragma yönergeler, derleyici seçenekleriyle aynı işlevselliği sağlar. Kaynak kodunda öğesine pragma ulaşıldığında, derleyici seçeneği tarafından belirtilen davranışı geçersiz kılar. Örneğin, belirttiyseniz /Zp8
, ile pack
kodun belirli bölümleri için bu derleyici ayarını geçersiz kılabilirsiniz:
cl /Zp8 some_file.cpp
// some_file.cpp - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8 again
// ...
__pragma
anahtar sözcüğü
Derleyici, yönergesi ile aynı işlevselliğe sahip Olan Microsoft'a özgü __pragma
anahtar sözcüğünü #pragma
de destekler. Aradaki fark, anahtar sözcüğün __pragma
makro tanımında satır içinde kullanılabilir olmasıdır. #pragma
Derleyici yönergesindeki sayı işareti karakterini ('#') dizeleme işleci (#) olarak yorumladığı için yönerge makro tanımında kullanılamaz.
Aşağıdaki kod örneği, anahtar sözcüğün __pragma
bir makroda nasıl kullanılabileceğini gösterir. Bu kod, "Derleyici COM Destek Örnekleri" içindeki ACDUAL örneğindeki mfcdual.h üst bilgisinden alıntılanır:
#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; \
_Pragma
Önişlem işleci
_Pragma
, Microsoft'a özgü __pragma
anahtar sözcüğüne benzer. C99'da C standardına ve C++11'de C++ standardına tanıtıldı. C'de yalnızca veya /std:c17
seçeneğini belirttiğinizde /std:c11
kullanılabilir. C++ için varsayılan mod da dahil olmak üzere tüm /std
modlarda kullanılabilir.
'nin aksine #pragma
, _Pragma
yönergeleri bir makro tanımına yerleştirmenize pragma olanak tanır. Dize değişmez değeri, aksi takdirde deyimini #pragma
takip eden değer olmalıdır. Örneğin:
#pragma message("the #pragma way")
_Pragma ("message( \"the _Pragma way\")")
Yukarıda gösterildiği gibi tırnak işaretleri ve ters eğik çizgilerden çıkış yapılmalıdır. pragma Tanınmayan bir dize yoksayılır.
Aşağıdaki kod örneği, anahtar sözcüğün _Pragma
onay benzeri bir makroda nasıl kullanılabileceğini gösterir. Koşul ifadesi sabit olduğunda uyarıyı gizleyen bir yönerge oluşturur pragma .
Makro tanımı, tek bir deyimmiş gibi kullanılabilmesi için çok deyimli makrolar için deyimini kullanır do ... while(0)
. Daha fazla bilgi için bkz . Stack Overflow'da C çok satırlı makro . _Pragma
Örnekteki deyim yalnızca onu izleyen kod satırı için geçerlidir.
// Compile with /W4
#include <stdio.h>
#include <stdlib.h>
#define MY_ASSERT(BOOL_EXPRESSION) \
do { \
_Pragma("warning(suppress: 4127)") /* C4127 conditional expression is constant */ \
if (!(BOOL_EXPRESSION)) { \
printf("MY_ASSERT FAILED: \"" #BOOL_EXPRESSION "\" on %s(%d)", __FILE__, __LINE__); \
exit(-1); \
} \
} while (0)
int main()
{
MY_ASSERT(0 && "Note that there is no warning: C4127 conditional expression is constant");
return 0;
}
Ayrıca bkz.
C/C++ ön işlemci başvurusu
C pragma yönergeleri
Anahtar Sözcükler