Я два дня искал ответ на этот вопрос, но безуспешно.Я никогда раньше не сталкивался с этой проблемой, поэтому постараюсь.Пожалуйста, потерпите меня.
Я вернулся в проект 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 будет переходить прямо к оператору else после достижения if (id == 30000)
каждый раз.Поскольку числа были c макросами в шестнадцатеричной записи, я сначала не заметил, что 40000
выходит за пределы signed short
.Это вводило в заблуждение и потратило много времени, пытаясь понять это: я перекомпилировал внешние библиотеки, переустановил g ++, среди прочего.
Очевидно, что id
unsigned short
устранило проблему.Другая проблема кажется проблемой компилятора.Но я до сих пор не понимаю, почему эти части кода были полностью пропущены во время выполнения и без оптимизации?Почему бы не пройти через все операторы if
, чтобы я мог определить реальную проблему?Есть идеи?
Большое спасибо.Я надеюсь, что это нормально для первого вопроса.