컴파일러 경고 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;