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

#pragmabelirteç dizesi
__pragma(belirteç dizesi) // öndeki 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:

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 packkodun 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
// ...

Anahtar __pragma 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. Örnek:

#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