Bagikan melalui


Peringatan Pengompilasi C5248

bagian 'section-name' dicadangkan untuk inisialisasi dinamis C++. Variabel yang dimasukkan secara manual ke dalam bagian dapat dioptimalkan dan urutannya relatif terhadap penginisialisasi dinamis yang dihasilkan kompilator tidak ditentukan

Keterangan

Pengkompilasi Microsoft C++ menggunakan nama bagian yang dipesan untuk implementasi internal fitur seperti inisialisasi dinamis C++. Jika kode Anda menyisipkan variabel di bagian yang dipesan, seperti .CRT$XCU, kode tersebut mengganggu pengkompilasi. Variabel Anda tidak dianggap sebagai inisialisasi dinamis C++. Selain itu, urutan inisialisasi relatifnya dibandingkan dengan penginisialisasi dinamis yang dihasilkan kompilator tidak ditentukan.

Untuk mengatasi kesalahan ini, jangan buat bagian yang menggunakan nama yang dipesan atau sisipkan variabel di bagian 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 C5248 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