Отвечая на this, я предложил использовать do {...} while(0)
для многострочных макросов.
В MSVC я обнаружил, что этот код подбрасывает:
warning C4127: conditional expression is constant
Чтобы сделать код без предупреждения, мне нужно выбрать одну из этих уродливых альтернатив:
Вариант 1
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4127)
#endif
code_using_macro_that_generates_C4217;
#ifdef _MSC_VER
#pragma warning(pop)
#endif
Вариант 2
Определите мои макросы как:
#define MULTI_LINE_MACRO do { ... } while(0,0)
или
#define MULTI_LINE_MACRO do { ... } while((void)0,0)
Также называется "сова" некоторыми программистами, поскольку (0,0)
выглядит как сова.
Вариант 3
Определите новый макрос WHILE_0, который не генерирует предупреждение и использует его вместо while(0)
Проблема
Я считаю, что все альтернативы более или менее ужасны. Почему MSVC генерирует это предупреждение для кажущегося правильного кода и мотивирует меня добавить некоторое уродство в мой код, чтобы сохранить код предупреждения бесплатно?
Я считаю, что постоянные выражения в условных выражениях являются вполне допустимыми и полезными, в частности, в конструкциях, основанных на способности компилятора оптимизировать код.
Кроме того, я не получаю warning C4127
для кода, подобного этому:
void foo(unsigned bar)
{
while (bar >= 0)
;
}
Мой вопрос: не является ли warning C4127: conditional expression is constant
совершенно бесполезным и не мотивирует ли он уродливый код? Предупреждает ли это предупреждение о написании лучшего кода?