Ответ на вопрос this, я предложил использовать do {...} while(0)
для многострочных макросов.является `предупреждение C4127` (условное выражение постоянное) когда-либо полезно?
На 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
полностью бесполезный и делает это не мотивируют уродливый код? Предупреждает ли это предупреждение о написании лучшего кода?
@Bathsheba: but 'for (;;)' не имеет то же значение, что 'do {' ... '} while (0)' !!!! –
Ну, если MSVC поддерживает C11 (*, который он не делает), тогда предупреждение не имеет большого смысла, поскольку у C11 есть конкретное исключение для [постоянных выражений в качестве управляющего выражения для предотвращения оптимизации бесконечных циклов] (http: // stackoverflow.com/a/28681034/1708801) Я понимаю, что это противоположный случай, но по-прежнему применяется. –
Удалите 'pragma' и [#include" no_sillywarnings_please.h "] (https://alfps.wordpress.com/the-no_sillywarnings_please-h-file/) –