Share via


Upozornění kompilátoru C5248

oddíl section 'section-name' je vyhrazen pro dynamickou inicializaci jazyka C++. Proměnné ručně vložené do oddílu mohou být optimalizovány a jejich pořadí vzhledem k vygenerovaným dynamickým inicializátorům kompilátoru není zadané.

Poznámky

Kompilátor jazyka Microsoft C++ používá názvy vyhrazených oddílů pro interní implementaci funkcí, jako je dynamická inicializace jazyka C++. Pokud váš kód vloží proměnnou do vyhrazeného oddílu, například .CRT$XCU, koliduje s kompilátorem. Vaše proměnná se nepovažuje za dynamický inicializátor jazyka C++. Také jeho relativní inicializační pořadí ve srovnání s kompilátorem generovanými dynamickými inicializátory není zadané.

Pokud chcete tuto chybu vyřešit, nevytvávejte oddíl, který používá vyhrazený název, ani nevkládejte proměnnou do vyhrazeného oddílu.

Neexistuje žádný standardní způsob, jak inicializovat proměnné napříč jednotkami překladu v určitém relativním pořadí pomocí kompilátoru vygenerovaných dynamických inicializátorů. Způsoby vynucení inicializace před nebo po vygenerovaných dynamických inicializátorů jazyka C++ jsou specifické pro implementaci. Další informace o podrobnostech implementace specifické pro Microsoft najdete v tématu Inicializace CRT.

Upozornění kompilátoru C5248 je v sadě Visual Studio 2019 verze 16.11 nové. Ve výchozím nastavení je vypnutý. Další informace o povolení tohoto upozornění najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá.

Příklad

Kód, který se snaží emulovat chování kompilátoru jazyka C++ pro dynamickou inicializaci, má často tento tvar:

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

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

Tento kód vytvoří oddíl s použitím vyhrazeného názvu .CRT$XCU. Zastaví kompilátor v vytvoření oddílu s očekávanými vlastnostmi a může přeskočit další inicializace. Proměnná i umístěná v oddílu je běžná proměnná a kompilátor ji nepovažuje za inicializátor. Kompilátor může optimalizovat i pryč. Relativní pořadí při zavolání ve f srovnání s jinými dynamickými inicializátory není zadáno.

Pokud pořadí inicializace není důležité, můžete pomocí tohoto vzoru dynamicky inicializovat proměnnou při spuštění:

void f();

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

init_helper i;

Viz také

Inicializace CRT