다음을 통해 공유


C28652

경고 C28652: 정적 이니셜라이저는 오버로드된 비트 연산자로 인해 쓰기 페이지에서 복사를 발생합니다.

전역 또는 정적 const 변수의 정적 이니셜라이저는 컴파일 시간에 완전히 평가될 수 있으므로 .rdata 섹션에서 생성할 수 있습니다. 그러나 이니셜라이저에 함수 호출이 필요한 경우 전체 이니셜라이저를 복사-쓰기 페이지에 배치할 수 있으며 성능 비용이 들 수 있습니다. 이 초기화에는 열거형 형식에서 오버로드된 비트 연산자를 호출합니다. 오버로드된 구현에 명백한 의미 체계가 있는 경우 적절한 캐스트 또는 매크로를 사용하면 쓰기에 복사하지 않고도 동일한 효과를 생성할 수 있습니다.

예제

다음 코드 예제에서는 이 경고를 생성합니다.

#include <nt.h>

typedef enum
{
    ENUM_VAL_1 = 0x1,
    ENUM_VAL_2 = 0x2,
    ENUM_VAL_3 = 0x4
} ENUM_VALS;

DEFINE_ENUM_FLAG_OPERATORS(ENUM_VALS);

const ENUM_VALS rgValsRuntime[] = {
    ENUM_VAL_1 | ENUM_VAL_2,    // Runtime init!
    ENUM_VAL_3                  // Compile time init
};  

다음 코드 예제에서는 이 경고를 방지합니다.

#include <nt.h>

typedef enum
{
    ENUM_VAL_1 = 0x1,
    ENUM_VAL_2 = 0x2,
    ENUM_VAL_3 = 0x4
} ENUM_VALS;

DEFINE_ENUM_FLAG_OPERATORS(ENUM_VALS);

const ENUM_VALS rgValsRuntime[] = {
    (ENUM_VALS) COMPILETIME_OR_2FLAGS(ENUM_VAL_1, ENUM_VAL_2),
    ENUM_VAL_3                  // Compile time init
};