Постоянное значение в условном выражении - PullRequest
8 голосов
/ 22 октября 2008

В вопросе о стиле кодирования о бесконечных циклах некоторые люди упоминали, что предпочитают стиль for (;;), потому что стиль while (true) выдает предупреждающие сообщения в MSVC о константе условного выражения.

Это меня очень удивило, так как использование постоянных значений в условных выражениях является полезным способом избежать ада #ifdef. Например, вы можете иметь в своем заголовке:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif

И код может просто использовать условное выражение и доверять компилятору, чтобы исключить мертвый код, когда CONFIG_FOO не определен:

if (foo_enabled) {
    ...
}

Вместо необходимости проверять CONFIG_FOO каждый раз, когда используется foo_enabled:

#ifdef CONFIG_FOO
if (foo_enabled) {
    ...
}
#endif

Этот шаблон проектирования все время используется в ядре Linux (например, include / linux / cpumask.h определяет несколько макросов, равных 1 или 0, когда SMP отключен, и для вызова функции, когда SMP включен).

В чем причина этого предупреждения MSVC? Кроме того, есть ли лучший способ избежать ада #ifdef без отключения этого предупреждения? Или это слишком широкое предупреждение, которое вообще нельзя включать?

Ответы [ 4 ]

10 голосов
/ 22 октября 2008

Предупреждение автоматически не означает, что код плохой , просто выглядит подозрительно.

Лично я начинаю с позиции включения всех предупреждений, которые могу, затем отключаю любое, которое оказывается скорее раздражающим, чем полезным. Тот, который срабатывает каждый раз, когда вы бросаете что-либо в бул, обычно идет первым.

5 голосов
/ 22 октября 2008

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

const int x = 0;

затем, вдали от объявления x, у вас есть условие типа:

if (x != 0) ...

Вы можете не заметить, что это константное выражение.

2 голосов
/ 22 октября 2008

Я верю, что нужно ловить такие вещи, как

 if( x=0 )

когда вы имели в виду

 if( x==0 )
0 голосов
/ 22 октября 2008

Простой способ избежать предупреждения:

#ifdef CONFIG_FOO
extern int foo_enabled;
#else
extern int foo_enabled = 0;
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...