Aracılığıyla paylaş


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$XCUayrı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$XCUayrı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;

Ayrıca bkz.

CRT başlatma