編譯程式警告 C5247
區段 'section-name' 已保留給 C++ 動態初始化。 手動建立區段將會干擾 C++ 動態初始化,並可能導致未定義的行為
備註
Microsoft C++編譯程式會使用保留區段名稱進行內部實作的功能,例如C++動態初始化。 如果您的程式代碼建立的區段名稱與保留區段相同,例如 .CRT$XCU
,它會干擾編譯程式。 它可能會防止其他動態初始化,並造成未定義的行為。
若要解決此錯誤,請勿建立使用保留名稱的區段。
沒有C++標準一致的方式,以編譯程式產生的動態初始化表達式的特定相對順序,跨轉譯單位初始化變數。 在編譯程式產生C++動態初始化表達式之前或之後強制初始化的方法是實作特定的。 如需Microsoft特定實作詳細數據的詳細資訊,請參閱 CRT初始化。
編譯程式警告 C5247 是 Visual Studio 2019 16.11 版的新功能。 按鈕預設為關閉。 如需如何啟用此警告的詳細資訊,請參閱預設為關閉的編譯器警告。
範例
嘗試模擬動態初始化C++編譯程式行為的程式代碼通常採用下列形式:
void f();
typedef void (*type)();
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) type i = f;
此程式代碼會使用保留名稱 .CRT$XCU
建立區段。 它會停止編譯程式建立具有預期屬性的 區段,而且可能會略過其他初始化。 放在 區段中的變數 i
是一般變數,而且編譯程式不會被視為初始化表達式。 編譯程式可能會優化 i
。 相較於其他動態初始化表達式,呼叫 時的 f
相對順序未指定。
如果初始化順序不重要,您可以使用此模式在啟動時動態初始化變數:
void f();
struct init_helper {
init_helper() { f(); }
};
init_helper i;