Share via


컴파일러 경고(수준 1) C5105

'정의됨'을 생성하는 매크로 확장에는 정의되지 않은 동작이 있습니다.

설명

전처리기가 매크로 확장 출력에서 연산자를 검색 defined 했습니다. defined 매크로 확장의 결과로 연산자가 나타나면 C 표준은 동작을 정의되지 않은 것으로 지정합니다. C5105 경고는 다른 규칙 컴파일러의 동작이 다를 수 있으므로 발생하는 이식성 및 표준 규칙 경고입니다. 이 문제를 해결하려면 매크로에서 연산자를 defined 이동하거나 경고 C5105를 표시하지 않습니다.

Microsoft 관련 동작: MSVC 컴파일러는 아래에서도 /permissive-연산자를 정상적으로 평가합니다defined.

이 경고는 Visual Studio 2017 버전 15.8의 새로운 기능입니다. 컴파일러 옵션으로 지정된 새 표준 준수 전처리기에서만 생성됩니다 /experimental:preprocessor .

코드를 변경하지 않고 경고를 끄려면

경고 pragma#pragma warning(suppress : 5105)를 사용하여 특정 코드 줄에 대한 경고를 끌 수 있습니다. 경고 pragma #pragma warning(disable : 5105)를 사용하여 파일 내에서 경고를 끌 수도 있습니다. /wd5105 명령줄 옵션을 사용하여 명령줄 빌드에서 전역적으로 경고를 끌 수 있습니다.

Visual Studio IDE에서 전체 프로젝트에 대한 경고를 해제하려면 다음을 수행합니다.

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 속성 페이지 대화 상자를 사용하는 방법에 대한 자세한 내용은 속성 페이지를 참조 하세요.
  2. 구성 속성>C/C++>고급 페이지를 선택합니다.
  3. 특정 경고 사용 안 함 속성을 편집하여 추가5105합니다. 확인을 선택하여 변경 내용을 적용합니다.

예시

이 샘플 프로그램은 경고 C5105를 생성하는 방법과 이를 해결하는 방법을 보여줍니다.

// C5105.cpp
// To demonstrate the warning,
// compile by using: cl /EHsc /experimental:preprocessor /DTEST C5105.cpp
// To fix the warning, change the DEFINED_TEST
// definition to the commented version.

#include <iostream>

#define DEFINED_TEST defined TEST
//#if defined TEST
//#define DEFINED_TEST 1
//#else
//#define DEFINED_TEST 0
//#endif

int main()
{
#if DEFINED_TEST  // C5105
    std::cout << "TEST defined\n";
#else
    std::cout << "TEST not defined\n";
#endif
}