/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. /EHa
hem /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 /EHs
kullanı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 /EHa
eşdeğerdir). /EHc
belirtilirse 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. /EHr
belirtilirse 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 /EHs
eş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 /EHscr
sahiptir.
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), /EHs
veya /EHa
gerektirir.
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 /EHsc
kullandığı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 , __except
ve __finally
söz dizimini __try
kullanabilirsiniz/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 /EHs
kodla aynı modülde yapılandırılmış özel durum işleme söz dizimini kullanabilirsiniz. Ancak, söz dizimini SEH C++ try
, throw
ve 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 /clr
kullanı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ş noexcept
iş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
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Kod Oluşturma'ya tıklayın.
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
- Bkz. ExceptionHandling.
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++)