Bagikan melalui


Peringatan Pengompilasi C5247

bagian 'section-name' dicadangkan untuk inisialisasi dinamis C++. Membuat bagian secara manual akan mengganggu inisialisasi dinamis C++ dan dapat menyebabkan perilaku yang tidak ditentukan

Keterangan

Pengkompilasi Microsoft C++ menggunakan nama bagian yang dipesan untuk implementasi internal fitur seperti inisialisasi dinamis C++. Jika kode Anda membuat bagian dengan nama yang sama dengan bagian yang dipesan, seperti .CRT$XCU, kode tersebut mengganggu pengkompilasi. Ini dapat mencegah inisialisasi dinamis lainnya dan menyebabkan perilaku yang tidak terdefinisi.

Untuk mengatasi kesalahan ini, jangan buat bagian yang menggunakan nama yang dipesan.

Tidak ada cara sesuai standar C++ untuk menginisialisasi variabel di seluruh unit terjemahan, dalam urutan relatif tertentu dengan penginisialisasi dinamis yang dihasilkan kompilator. Cara untuk memaksa inisialisasi sebelum atau sesudah pengkompilasi yang dihasilkan penginisialisasi dinamis C++ bersifat spesifik implementasi. Untuk informasi selengkapnya tentang detail implementasi khusus Microsoft, lihat Inisialisasi CRT.

Compiler Warning C5247 baru di Visual Studio 2019 versi 16.11. Ini mati secara default. Untuk informasi selengkapnya tentang cara mengaktifkan peringatan ini, lihat Peringatan pengkompilasi yang nonaktif secara default.

Contoh

Kode yang mencoba meniru perilaku pengkompilasi C++ untuk inisialisasi dinamis sering mengambil formulir ini:

void f();
typedef void (*type)();

#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;

Kode ini membuat bagian menggunakan nama yang dipesan, .CRT$XCU. Ini menghentikan pengkompilasi membuat bagian dengan properti yang diharapkan, dan dapat melewati inisialisasi lainnya. Variabel i yang ditempatkan di bagian adalah variabel reguler, dan tidak dianggap sebagai penginisialisasi oleh pengkompilasi. Pengkompilasi dapat mengoptimalkannya i . Urutan relatif ketika f dipanggil dibandingkan dengan inisialisasi dinamis lainnya tidak ditentukan.

Jika urutan inisialisasi tidak penting, Anda dapat menggunakan pola ini untuk menginisialisasi variabel secara dinamis saat startup:

void f();

struct init_helper {
    init_helper() { f(); }
};

init_helper i;

Baca juga

Inisialisasi CRT