나는 이것을 성공하기 위해 이틀 동안 답을 찾았다. 나는이 문제를 처음부터 경험해 본 적이 없으므로 최선을 다할 것입니다. 나와 함께 견뎌주세요.최적화가 없으면 C++ 코드가 이상하게 건너 뜁니다. 어떤 아이디어?
나는 1 년 전에 만들었던 C++ 프로젝트로 돌아 갔는데, 당시 문제없이 실행되었습니다. 내가 같은 프로그램을 실행하려고 할 때 나는이 흥미롭고 엄청나게 짜증나는 문제를 보았습니다.
file.h
...
short id;
...
file.cc
id = 0;
while (id < some_large_number)
{
id = foo();
if (id == 2)
{
//do something
}
else if (id == 2900)
{
//do something
}
else if (id == 30000)
{
//do something
}
else if (id == 40000)
{
//do something
}
else if (id == 45000)
{
//do something
}
else
{
//do something else
}
}
상수 숫자는 내가이 예를 들어 확장 진수 표기법으로 매크로했다 : 코드는 무엇인가 같았다. 이것은 진정한 버그 였지만 디버거는 쉽게 발견하지 못했습니다. 무슨 일이 있었는지 :
GDB를 사용하여 코드를 단계별로 실행하려고 했으므로 GDB는 매번 if (id == 30000)
에 도달 한 후 곧바로 else 문으로 이동합니다. 숫자는 16 진수 표기법으로 된 매크로이므로 처음에는 40000
이 signed short
의 한계를 넘지 않았 음을 알지 못했습니다. 이것은 매우 오도하고 오랜 시간을 보냈다. 외부 라이브러리를 다시 컴파일하고 g ++를 다시 설치했다.
분명히 id
을 unsigned short
으로 수정하면 문제가 해결됩니다. 다른 문제는 컴파일러 문제처럼 보입니다. 하지만 여전히 이해할 수 없는데, 실행 중에 코드의 섹션이 완전히 건너 뛰었고 최적화가 이루어지지 않은 이유는 무엇입니까? 왜 각각의 if
문을 통과하지 않을 것이고, 그런 식으로 실제 문제를 확인할 수 있습니까? 어떤 아이디어?
고마워요. 나는 이것이 첫 번째 질문에 괜찮 으면 좋겠다.
C++에서 매크로를 사용하면 요청한 것을 얻을 수 있습니다. – Puppy
컴파일러에서 경고하지 않았습니까? 추가 경고 없이도 g ++ 4.5에서는 사례 레이블이 해당 유형의 최대 값을 초과한다고 불평 할 것입니다. 다른 컴파일러의 경우에는 몇 가지 플래그와 함께 추가 경고를 추가 할 수 있습니다. * 모든 경고를 읽고, 고치고 배우십시오 *. –
컴파일러가 경고하지 않았습니다. 그리고 나는 -Wall 옵션을 설정했습니다. 그러나 if 문을 전환하여 사례를 전환하면 경고가 표시됩니다. 내가 사용하는 컴파일러 버전은 g ++ 4.4.3입니다. – lospro7