Share via


Upozornění kompilátoru C5247

oddíl section 'section-name' je vyhrazen pro dynamickou inicializaci jazyka C++. Ruční vytvoření oddílu bude kolidovat s dynamickou inicializací jazyka C++ a může vést k nedefinovanýmu chování.

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 vytvoří oddíl se stejným názvem jako vyhrazený oddíl, například .CRT$XCU, koliduje s kompilátorem. Může zabránit jiné dynamické inicializaci a způsobit nedefinované chování.

Pokud chcete tuto chybu vyřešit, nevytvávejte oddíl, který používá vyhrazený název.

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 C5247 je nové v sadě Visual Studio 2019 verze 16.11. 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