- 1
if(0){}else for (... тут всякий код...) и тут всякий код
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−17
if(0){}else for (... тут всякий код...) и тут всякий код
Из реализации foreach в Qt. Не ГК. Кто первый скажет почему не ГК получит пирожок с полочки.
if (1) for ...
или вообще не
{ for (...)
{
}}
?
переменная 'i' не должна существовать после тела 'for'. А в старом VC++ она продолжала жить и далее.
Только в явно выписанном коде подобный трюк с 'if;else' не имеет никакого смысла - можно было просто взять этот 'for' в дополнительные скобки '{}' и дело с концом. Из поста не ясно, было ли это в оригинале макросом, или все таки было выписано посередине обыкновенного кода. В последнем случае - есть элемент "говнокодовости".
Так вот, этот трюк с 'if;else' применяется именно для написания макроса/макросов, решающего данную проблему. В частности, самым радикальным вариантом будет просто сделать
т.е. фактически нагло "переопределить" ключевое слово 'for' и вопрос решен.
А сам трюк с 'if;else' (вне зависимости от проблемы с 'for') произрастает из техники правильного написания многострочных (т.е. много-stetement-ных) макросов. Правильно написанный многострочный макрос должен быть либо заооболочен в скобки 'do{ ... } while (false)', либо в скобки 'if (false); else { ... }'. Подобная "оболочка" вокруг макроса делает его поведение правильным при использовании в ветках внешних if-ов.
Да, код взят из макроса foreach.
не угодил?
ветка 'else' будет проассоциирована с "невидимым" if-ом спрятанным внутри макроса 'for'. Это, разумеется, будет большой неожиданностью для автора кода и доставит ему массу счастливых часов недоуменной отладки.