2009-06-11 2 views
0

Я пытаюсь скомпилировать LightZPng с предупреждениями на уровне 4. Я получаю много C4127 на строках, которые явно не достойны этого предупреждения. Пример:Нечетное предупреждение C4127: условное выражение постоянное "под VS2005

#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?

ответ

4

Там есть кусок кода в верхней части 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, как я думал).

Просто прокомментируйте или удалите эту строку из файла (я не могу понять, почему они это сделают).

+0

Хороший улов, @WinProg, выложил его для вас и сделал + 1. – paxdiablo

+0

Возможно, это нуждается в дополнительном объяснении? Это приводит к тому, что каждое последующее появление токена расширяется до оператора if, содержащего оператор for. VC++ диагностирует, если (false), как имеющий постоянное условное выражение, не шутит. Если вы удалите эту строку, будет меньше случаев if (false) в программе. –

+0

Мы писали в то же время. Извините, если мой комментарий выглядит оскорбительным. –

1

Да, это его странно. Это действительно не постоянное выражение с 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; 
} 

Однако, у вас есть на самом деле не - спросил вопрос. Что вы хотите знать или хотите, чтобы мы это сделали?

Update:

См «Windows программист» ответ "s для фактической причины - есть "#define for if (false) {} else for" в верхней части LightZ.cpp, которая вызывает проблему.

+0

Добавлен вопрос .. просто в основном хотите изменить код, чтобы избежать предупреждения, не отключая при этом предупреждение. –

+0

Вы хотите изменить код?Удалите строку, указанную в моем ответе. –

0

Я тестировал его на своем VS2005, и предупреждение не появляется даже на уровне предупреждения 4..

Простая процедура для вас следовать:

-Создание новой консоли App и место только выше код и посмотреть, если предупреждение появляется снова.

-Если нет, проверьте различия в настройках проекта.

-Если да, я бы предположил, что ваша настройка оптимизации может вызвать его.

+0

Да, некоторые настройки проекта говорят VC++ проверять такие вещи, как if (false), а некоторые параметры проекта сообщают VC++ не проверять такие вещи, как if (false). –

0

According to Charles Nicholson, Visual Studio 2005 дает эту ошибку с «do...while(0)» трюк:

#define MULTI_LINE_MACRO \ 
    do { \ 
     doSomething(); \ 
     doSomethingElse(); \ 
    } while(0) 

Если вы абсолютно необходимо, вы можете использовать __pragma директиву, чтобы выборочно отключить это предупреждение вокруг конкретного фрагмента кода.

+0

Он также дает это предупреждение для if (false), как мы видели в этом вопросе. –

Смежные вопросы