Derleyici Uyarısı C5248
'section-name' bölümü C++ dinamik başlatma için ayrılmıştır. Bölüme el ile yerleştirilen değişkenler iyileştirilebilir ve derleyici tarafından oluşturulan dinamik başlatıcılara göre sıraları belirtilmez
Açıklamalar
Microsoft C++ derleyicisi, C++ dinamik başlatma gibi özelliklerin iç uygulanması için ayrılmış bölüm adlarını kullanır. Kodunuz gibi .CRT$XCU
ayrılmış bir bölüme bir değişken eklerse derleyiciyi engeller. Değişkeniniz bir C++ dinamik başlatıcısı olarak kabul edilmez. Ayrıca, derleyici tarafından oluşturulan dinamik başlatıcılarla karşılaştırıldığında göreli başlatma sırası belirtilmez.
Bu hatayı çözmek için ayrılmış adı kullanan bir bölüm oluşturmayın veya ayrılmış bölüme bir değişken eklemeyin.
Derleyici tarafından oluşturulan dinamik başlatıcılarla belirli bir göreli sırada çeviri birimleri arasında değişkenleri başlatmanın C++ standardına uygun bir yolu yoktur. Derleyici tarafından oluşturulan C++ dinamik başlatıcılarından önce veya sonra başlatmayı zorlamanın yolları uygulamaya özgü bir yöntemdir. Microsoft'a özgü uygulama ayrıntıları hakkında daha fazla bilgi için bkz . CRT başlatma.
Derleyici Uyarısı C5248, Visual Studio 2019 sürüm 16.11'de yenidir. Varsayılan olarak kapalıdır. Bu uyarıyı etkinleştirme hakkında daha fazla bilgi için bkz . Varsayılan olarak kapalı olan derleyici uyarıları.
Örnek
Dinamik başlatma için C++ derleyici davranışını öykünmeye çalışan kod genellikle şu biçimi alır:
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
Bu kod, .CRT$XCU
ayrılmış adı olan bir bölüm oluşturur. Derleyicinin beklenen özelliklere sahip bölümü oluşturmasını durdurur ve diğer başlatmaları atlayabilir. bölümüne yerleştirilen değişken i
normal bir değişkendir ve derleyici tarafından başlatıcı olarak kabul edilmez. Derleyici iyileştirerek i
dışarıda bırakılabilir. Diğer dinamik başlatıcılarla karşılaştırıldığında çağrıldığında f
göreli sıra belirtilmez.
Başlatma sırası önemli değilse, başlangıçta bir değişkeni dinamik olarak başlatmak için bu düzeni kullanabilirsiniz:
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;