В вопросе о стиле кодирования о бесконечных циклах некоторые люди упоминали, что предпочитают стиль 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 без отключения этого предупреждения? Или это слишком широкое предупреждение, которое вообще нельзя включать?