- 1
- 2
- 3
- 4
- 5
void somefunc(bool val)
{
assert(0 == val || 1 == val);
...
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+83
void somefunc(bool val)
{
assert(0 == val || 1 == val);
...
}
Многоуровневый говнокод. Во первых, индусское сравнение задом наперед. Во вторых, выражение в ассерте всегда истенно. Когда GCC возбухнул по этому поводу, то код был за-#ifdef-ен, но оставлен для других менее умных компиляторов.
Недавно на си-подобных языках начал писать, да?
сильно..
Возможно данный код был портирован с Си, где вместо bool использовали int, и проверяли этот самый инт на допустимые значения. При портировании int превратился в bool, а assert убрать забыли.
0 == val не говно, а способ избежать глупой ошибки на старых компиляторах, которые не умели выдавать предупреждение о попутанных = и ==.
P.S. Кстати в assert это предупреждение и сейчас не выдается ;) Только в if/while и им подобных.
И все-таки 0 == val - это говно!
Если C и bool - тупо typedef unsigned char bool, то да - может и есть смысл.
А то был у нас проект для embedded железяки - там кто что хотел, то и дефайнил как TRUE, но FALSE всегда был 0. И это порождало столько проблем, что в конечном итоге это привело к добавлению в стиль кодирования условия, говорившего что с TRUE в логических выражения сравнивать ни в каком случае нельзя - надо выражения выстраивать так чтоб сравнивалось с FALSE.
Ну пусть даже у ОПа такая запущенная ситуация, но почему было не сделать макрос IS_BOOL(var) ?
Вот за сравнение чего-либо с TRUE и FALSE (да и true и false) нужно убивать. Это же типичный бульшит...
> там кто что хотел, то и дефайнил как TRUE
> но FALSE всегда был 0
При таких условиях работать будет без проблем.