Derleyici Uyarısı C5247
'section-name' bölümü C++ dinamik başlatma için ayrılmıştır. Bölümü el ile oluşturmak C++ dinamik başlatmasını engeller ve tanımsız davranışa yol açabilir
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ümle aynı ada sahip bir bölüm oluşturursa, derleyiciyi engeller. Diğer dinamik başlatmayı engelleyebilir ve tanımsız davranışlara neden olabilir.
Bu hatayı çözmek için ayrılmış adı kullanan bir bölüm oluşturmayın.
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ı C5247, 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;