Для кода
while(1)
{
/* ..... */
}
MSVC генерирует следующее предупреждение.
warning C4127: conditional expression is constant
На странице MSDN для предупреждения предлагается использовать для (;;)
вместо , а (1)
. Мне интересно, какое преимущество дает для (;;)
и почему оно предупреждает о постоянном использовании в в то время как
?
Какой флаг следует использовать в GCC для получения того же предупреждения?
Постоянные условия достаточно часто являются просто ошибками. Рассмотрим следующее:
unsigned k;
...
while (k>=0)
{
...
}
Условие k>=0
имеет смысл, если k - знаковый int, но не для беззнаковых. Невнимательный разработчик забывает, что k было объявлено беззнаковым, и использует его так, как будто его можно использовать как отрицательное число. Компилятор пытается быть полезным и предупредить вас об этом, и while(1)
попадает для компилятора в тот же класс проблем. for(;;)
предпочтительнее, потому что однозначно означает `зацикливание навсегда
for(;;)
и while (true)
отличаются тем, что первая является особым случаем определенного бесконечного цикла, а вторая является своего рода злоупотреблением, говорящим "true, always". "
Предупреждение появляется потому, что бесконечные циклы, когда они вам не нужны, довольно вредны, поэтому при первых же признаках предупреждается, что у вас может быть такой цикл. Но используя for(;;;)
, вы практически явно сказали "зацикливать это вечно", и предупреждать не о чем.
Я не думаю, что в GCC есть эквивалентное предупреждение.