/EH (Özel durum işleme modeli)

Derleyici tarafından oluşturulan özel durum işleme modeli desteğini belirtir. Bağımsız değişkenler, söz dizimlerinin hem yapılandırılmış hem de standart C++ özel durumlarına uygulanıp uygulanmayacağınıcatch(...), özel durumlar için throw "C" kodunun varsayılıp varsayılmayacağını extern ve belirli noexcept denetimlerin iyileştirilip iyileştirmeyeceğini belirtir.

Sözdizimi

/EHa[-]
/EHs[-]
/EHc[-]
/EHr[-]

Bağımsız değişkenler

a
Standart C++ yığınını geri sarmayı etkinleştirir. Söz dizimi kullandığınızda catch(...) hem yapılandırılmış (zaman uyumsuz) hem de standart C++ (zaman uyumlu) özel durumlarını yakalar. /EHahem /EHc hem de /EHs bağımsız değişkenlerini geçersiz kılar.

s
Standart C++ yığınını geri sarmayı etkinleştirir. Söz dizimi kullandığınızda yalnızca standart C++ özel durumlarını yakalar catch(...) . Ayrıca belirtilmediği sürece/EHc, derleyici "C" olarak extern bildirilen işlevlerin C++ özel durumu olabileceğini throw varsayar.

c
ile /EHskullanıldığında derleyici, "C" olarak extern bildirilen işlevlerin hiçbir zaman throw bir C++ özel durumu olmadığını varsayar. ile /EHa kullanıldığında hiçbir etkisi yoktur (yani , /EHca ile /EHaeşdeğerdir). /EHcbelirtilirse veya /EHa belirtilmezse /EHs yoksayılır.

r
Derleyiciye her zaman tüm noexcept işlevler için çalışma zamanı sonlandırma denetimleri oluşturmasını söyler. Varsayılan olarak, derleyici işlevin yalnızca atanmayan işlevleri çağırdığını belirlerse için çalışma zamanı denetimleri noexcept iyileştirilebilir. Bu seçenek, bazı ek kodlar karşılığında katı C++ uyumluluğu sağlar. /EHrbelirtilirse veya /EHa belirtilmezse /EHs yoksayılır.

-
Önceki seçenek bağımsız değişkenini temizler. Örneğin, /EHsc- olarak /EHs /EHc-yorumlanır ve ile /EHseşdeğerdir.

/EH bağımsız değişkenler ayrı olarak belirtilebilir veya herhangi bir sırada birleştirilebilir. Aynı bağımsız değişkenin birden fazla örneği belirtilirse, son örnek öncekileri geçersiz kılar. Örneğin, /EHr- /EHc /EHs ile aynıdır /EHscr-ve /EHscr- /EHr ile aynı etkiye /EHscrsahiptir.

Açıklamalar

Varsayılan özel durum işleme davranışı

Derleyici her zaman zaman uyumsuz yapılandırılmış özel durum işlemeyi (SEH destekleyen kod oluşturur). Varsayılan olarak (, veya /EHa seçeneği belirtilmemişse/EHs/EHsc), derleyici yerel C++ catch(...) yan tümcesindeki işleyicileri desteklerSEH. Ancak, C++ özel durumlarını yalnızca kısmen destekleyen kod da oluşturur. Varsayılan özel durum geri sarma kodu, bir özel durum nedeniyle kapsamın dışına çıkan blokların try dışındaki otomatik C++ nesnelerini yok etmez. C++ özel durumu oluştuğunda kaynak sızıntıları ve tanımsız davranış oluşabilir.

Standart C++ özel durum işleme

Yığın nesnelerini güvenli bir şekilde kaldıran Standart C++ özel durum işleme modeli için tam derleyici desteği ( /EHsc önerilen), /EHsveya /EHagerektirir.

veya kullanıyorsanız /EHs yan tümceleriniz catch(...) zaman uyumsuz yapılandırılmış özel durumlar değildircatch./EHsc Erişim ihlalleri ve yönetilen System.Exception özel durumlar yakalanmaz. Ayrıca, zaman uyumsuz özel durum oluştuğunda kapsam içindeki nesneler, kod zaman uyumsuz özel durumu işlese bile yok olmaz. Bu davranış, yapılandırılmış özel durumları işlenmemiş bırakmak için bir bağımsız değişkendir. Bunun yerine, bu özel durumları önemli olarak düşünün.

veya /EHsckullandığınızda/EHs, derleyici özel durumların yalnızca bir throw deyimde veya işlev çağrısında gerçekleşebileceğini varsayar. Bu varsayım, derleyicinin birçok geri alamayan nesnenin yaşam süresini izlemeye yönelik kodu ortadan kaldırmasını sağlar ve bu da kod boyutunu önemli ölçüde azaltabilir. kullanırsanız /EHa, derleyici blokları agresif bir şekilde iyileştirmediğinden try yürütülebilir görüntünüz daha büyük ve yavaş olabilir. Ayrıca, derleyici bir C++ özel durumu görse throw bile yerel nesneleri otomatik olarak temizleyen özel durum filtrelerinde bırakır.

Yapılandırılmış ve standart C++ özel durum işleme

Derleyici /EHa seçeneği, hem zaman uyumsuz özel durumlar hem de C++ özel durumları için güvenli yığın geri sarmayı etkinleştirir. Yerel C++ yan tümcesini kullanarak hem standart C++ catch(...) hem de yapılandırılmış özel durumların işlenmesini destekler. belirtmeden uygulamak SEH için , __exceptve __finally söz dizimini __trykullanabilirsiniz/EHa. Daha fazla bilgi için bkz . Yapılandırılmış özel durum işleme.

Önemli

/EHa kullanarak catch(...) tüm özel durumları belirtmek ve işlemeye çalışmak tehlikeli olabilir. Çoğu durumda, zaman uyumsuz özel durumlar kurtarılamaz olarak kabul edilir ve önemli olarak düşünülmelidir. Onları yakalamak ve devam etmek, işlemin bozulmasına neden olarak bulunması ve giderilmesi zor olan hatalara yol açabilir.

Windows ve Visual C++ desteklese SEHde, ISO standart C++ özel durum işleme (/EHsc veya /EHs) kullanmanızı kesinlikle öneririz. Kodunuzu daha taşınabilir ve esnek hale getirir. Eski kodda veya belirli program türlerinde kullanmanız SEH gereken zamanlar olabilir. Örneğin ortak dil çalışma zamanını (/clr ) desteklemek için derlenmiş kodda gereklidir. Daha fazla bilgi için bkz . Yapılandırılmış özel durum işleme.

Kullanılarak /EHa derlenen nesne dosyalarını veya aynı yürütülebilir modülde derlenen /EHs /EHsc dosyalara asla bağlamamanızı öneririz. Modülünüzde herhangi bir yeri kullanarak /EHa zaman uyumsuz bir özel durumu işlemeniz gerekiyorsa modüldeki tüm kodu derlemek için kullanın /EHa . kullanılarak derlenen /EHskodla aynı modülde yapılandırılmış özel durum işleme söz dizimini kullanabilirsiniz. Ancak, söz dizimini SEH C++ try, throwve catch ile aynı işlevde karıştıramazsınız.

dışında bir özel durum tarafından tetiklenen bir throwözel durum istiyorsanız catch kullanın/EHa. Bu örnekte yapılandırılmış bir özel durum oluşturulup yakalanmaktadır:

// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;

void fail()
{
    // generates SE and attempts to catch it using catch(...)
    try
    {
        int i = 0, j = 1;
        j /= i;   // This will throw a SE (divide by zero).
        printf("%d", j);
    }
    catch(...)
    {
        // catch block will only be executed under /EHa
        cout << "Caught an exception in catch(...)." << endl;
    }
}

int main()
{
    __try
    {
        fail();
    }

    // __except will only catch an exception here
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        // if the exception was not caught by the catch(...) inside fail()
        cout << "An exception was caught in __except." << endl;
    }
}

/clr altında özel durum işleme

Seçeneğin /clr anlamı /EHa (başka bir ifadeyle /clr /EHa yedeklidir). Derleyici, veya /EHsc sonrasında /clrkullanılıyorsa /EHs bir hata oluşturur. İyileştirmeler bu davranışı etkilemez. Bir özel durum yakalandığında, derleyici özel durumla aynı kapsamdaki tüm nesneler için sınıf yıkıcılarını çağırır. Özel durum yakalanmazsa, bu yıkıcılar çalıştırılamaz.

altında /clrözel durum işleme kısıtlamaları hakkında bilgi için bkz . _set_se_translator.

Çalışma zamanı özel durum denetimleri

seçeneği, /EHr özniteliği olan noexcept tüm işlevlerde çalışma zamanı sonlandırma denetimlerini zorlar. Varsayılan olarak, derleyici arka ucu bir işlevin yalnızca atanmayan işlevleri çağırdığını belirlerse çalışma zamanı denetimleri iyileştirilebilir. Atanmayan işlevler, özel durum oluşturulabileceğini belirten bir özniteliği olan işlevlerdir. Bunlar, belirtildiğinde /EHc extern "C" , throw(), __declspec(nothrow)ve olarak işaretlenmiş noexceptişlevler içerir. Oluşturmayan işlevler, derleyicinin inceleme tarafından oluşturma olmadığını belirlediği işlevleri de içerir. kullanarak /EHr-varsayılan davranışı açıkça ayarlayabilirsiniz.

Atanmayan bir öznitelik, özel durumların bir işlev tarafından oluşturulamazsınız garantisi değildir. BIR noexcept işlevin davranışından farklı olarak, MSVC derleyicisi , __declspec(nothrow)veya extern "C" kullanılarak throw()bildirilen bir işlev tarafından tanımsız davranış olarak oluşan bir özel durumu dikkate alır. Bu üç bildirim özniteliğini kullanan işlevler, özel durumlar için çalışma zamanı sonlandırma denetimlerini zorunlu kılmaz. Derleyiciyi /EHr bir işlevden kaçan noexcept işlenmemiş özel durumlar için çalışma zamanı denetimleri oluşturmaya zorlayarak bu tanımsız davranışı belirlemenize yardımcı olması için seçeneğini kullanabilirsiniz.

Visual Studio'da veya program aracılığıyla seçeneğini ayarlama

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Kod Oluşturma'ya tıklayın.

  3. C++ Özel Durumlarını Etkinleştir özelliğini değiştirin.

    Alternatif olarak, C++ Özel Durumlarını Etkinleştir'i Hayır olarak ayarlayın ve komut satırı özellik sayfasında, Ek Seçenekler kutusuna derleyici seçeneğini ekleyin.

Bu derleyici seçeneğini program üzerinden ayarlamak için

Ayrıca bkz.

MSVC Derleyicisi seçenekleri
MSVC Derleyicisi komut satırı söz dizimi
Hatalar ve özel durum işleme
Özel durum belirtimleri (throw)
Yapılandırılmış Özel Durum İşleme (C/C++)