컴파일러 경고(수준 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에서 전체 프로젝트에 대한 경고를 해제하려면 다음을 수행합니다.
- 프로젝트에 대한 속성 페이지 대화를 엽니다. 속성 페이지 대화 상자를 사용하는 방법에 대한 자세한 내용은 속성 페이지를 참조하세요.
- 구성 속성>C/C++>고급 페이지를 선택합니다.
- 특정 경고 사용 안 함 속성을 편집하여
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
}