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;