홀수 "경고 C4127 : 조건부 표현이 일정하다"
-
13-09-2019 - |
문제
컴파일하려고합니다 lightzpng 레벨 4에 대한 경고로 나는이 경고에 합당하지 않은 라인에서 많은 C4127을 얻습니다. An example:
#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
for ( int i = 0; i <= MAX_BITS; ++i ) // C4127 is here
values_per_bitlen[ i ] = 0;
#Pragma 이외의 경고를 피하기 위해이 코드를 어떻게 변경할 수 있습니까?
해결책
lightz.cpp 상단에 코드가 있습니다.
#define for if (false) {} else for
즉, 실제 진술은 다음과 같습니다.
#define for if (false) {} else for ( int i = 0; i <= MAX_BITS; ++i )
그렇기 때문에 일정한 표현식 오류가 발생합니다 ( false
, i <= MAX_BITS
생각했던 데로).
파일에서 해당 줄을 주석하거나 삭제하기 만하면 (실제로 왜 그렇게할지 알 수는 없습니다).
다른 팁
예, 그게 이상합니다. 정말입니다 ~ 아니다 그 이후로 일정한 표현 i
루프의 변경. 따라서 이것은 VS2005에서 문제가 될 것 같습니다. 가치가있는 것에 대해 VS2008도 똑같은 일을합니다.
이상하게도 프로젝트 단지 이것으로 불평하지 않으므로 Microsoft의 경고 생성 코드에서 이상한 에지 문제 일 수 있습니다.
#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
int main(int argc, char* argv[]) {
for ( int i = 0; i <= MAX_BITS; ++i )
values_per_bitlen[ i ] = 0;
return 0;
}
그러나 실제로 질문을하지 않았습니다. 당신이 알고 싶어하는 것은 무엇입니까, 또는 우리가하고 싶은가?
업데이트:
실제 원인에 대한 "Windows 프로그래머"의 답변을 참조하십시오. "#define for if (false) {} else for"
Lightz.cpp의 상단에서 문제가 발생합니다.
VS2005에서 테스트했으며 경고 레벨 4에서도 경고가 나타나지 않습니다.
따라야 할 간단한 절차 :
-새 콘솔 앱을 만들고 위의 코드 만 배치하고 경고가 다시 나타나는지 확인하십시오.
-그렇지 않은 경우 프로젝트 설정의 차이점을 확인하십시오.
-그렇다면 최적화 설정으로 인해 원인이 될 수 있습니다.
Charles Nicholson에 따르면, Visual Studio 2005는 "do...while(0)
"트릭 :
#define MULTI_LINE_MACRO \
do { \
doSomething(); \
doSomethingElse(); \
} while(0)
당신이 절대적으로해야한다면, 당신은 그것을 사용할 수 있습니다 __pragma 특정 코드 조각 주변의 경고를 선택적으로 비활성화하는 지침.