нечетное «предупреждение C4127: условное выражение константа» в соответствии с VS2005 - PullRequest
0 голосов
/ 12 июня 2009

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

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

4 голосов
/ 12 июня 2009

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

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

1 голос
/ 12 июня 2009

Да, это странно. Это действительно , а не константное выражение, поскольку 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» для выяснения фактической причины - в верхней части LightZ.cpp есть "#define for if (false) {} else for", который вызывает проблему.

0 голосов
/ 12 июня 2009

Согласно Чарльзу Николсону , Visual Studio 2005 выдает эту ошибку с помощью трюка "do...while(0)":

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

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

0 голосов
/ 12 июня 2009

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

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

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

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

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

...