Причины не использовать _Bool в Objective-C? - PullRequest
19 голосов
/ 03 апреля 2011

Начиная с C99, C теперь имеет правильный логический тип, _Bool.Objective-C, как строгий надмножество C, наследует это, но когда он был создан еще в 1980-х годах, не было никакого булева типа C, поэтому Objective-C определил BOOL как signed char.

Весь Cocoa использует BOOL, как и весь не-NeXT / Apple Cocoa код, который я видел.Очевидно, что для совместимости с существующими протоколами (например, -applicationShouldTerminateAfterLastWindowClosed: из NSApplicationDelegate) предпочтительным является сопоставление с уже объявленным типом, если только по какой-либо другой причине, кроме как для предупреждения предупреждения.

Для целей чистоты / читаемости, stdbool.h определяет bool как синоним для _Bool, так что те из нас, кто не хочет лишних подчеркиваний в нашем коде, могут использовать это.

Три других полезных замечания:

  • @encode(_Bool) оценивается как "B".(@encode(BOOL) оценивается в "c", для signed char.)
  • sizeof(_Bool) оценивается в 1, что следует из определения С99, что _Bool настолько велика, насколько необходимо для его двухвозможные значения.( Редактировать: На самом деле, стандарт говорит только о том, что он должен быть «достаточно большим», чтобы содержать эти два значения; он не устанавливает верхнюю границу и, фактически, Mac OS X на 32-bit PowerPC определяет его как 4 байта. Разница в размере - это еще одна вещь для файла при возможных BOOL -vs .- bool проблемах совместимости.)
  • На этом примечании только два возможных значения_Bool равны 1 и 0. Любые другие значения преобразуются в одно из них при назначении, как если бы вы выполнили двойное отрицание (!!) или проверили неравенство с 0 (!= 0).Единственный способ получить _Bool с каким-либо другим значением - это обычные магики: псевдонимы и объединения указателей.

Есть ли основания не использовать _Bool / bool в новом коде?

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Я думаю, что вы почти ответили на свой вопрос - причина не использовать _Bool в новом коде Какао заключается в том, что, пока Apple не изменит свои рамки на использование _Bool (или, более вероятно, bool, определенный в stdbool.h), вынарушаете соглашение и, возможно, совместимость (по крайней мере, без хаков) с помощью _Bool или bool.Хотя я уже несколько лет увлекаюсь программированием Какао, держу пари, что если Apple вообще включит _Bool, они, вероятно, просто переопределят макрос BOOL, чтобы в любом случае использовать новый тип за кулисами, чтобы избежать неописанного редактированияк их структуре и ее документации.

При этом, (и позвольте мне предварить это, отказавшись от того, что я еще не смешал код C с Objective-C и не знаю соглашений для этого)у вас гораздо лучший пример использования нового _Bool в функциях C, возможно, с оговоркой, что он используется только для внутренних целей и не требует, чтобы метод Objective-C передавал _Bool, просто чтобы избежать путаницы для будущих программистов.Вы также, конечно, должны быть довольны тем, что всегда нуждаетесь в компиляции C99, чего у людей все еще могут быть причины избегать.Учитывая, что YES - это макрос для 1, а NO - это макрос для 0, похоже, что выиграть от более новой версии C, чтобы получить другое значение размера char, которое использует только 1 или 0, не так уж и много.

Честно говоря, когда дело доходит до этого, вы можете обойти любую из этих причин с помощью достаточного количества хакерских атак или ограничений, налагаемых на возможность повторного использования, но конечное оправдание заключается в том, что он (в настоящее время) не является частью сленга Cocoa / Objective-C, и егоПреимущества, вероятно, не перевесят потерю читабельности и / или дополнительную путаницу с другими менее знакомыми программистами, читающими ваш код.

0 голосов
/ 27 ноября 2011

Я согласен с @pst.Objective-C не скрывает C, но это все еще слой поверх C. Это означает, что Objective-C - это просто другой слой.

Я думаю, что это проблема языкового контекста .Это не всегда понятно, но мы знаем вид контекста C и Objective-C.Как American против Americano.По сути, они имеют одно и то же значение, но различают контекст и могут немного отличаться в зависимости от контекста.И это может сделать некоторую очевидную информацию для читателя, когда эти маленькие детали накапливаются.Это поможет улучшить читаемость кода.

И я считаю, что вы должны знать о важности читабельности.Если читаемость не важна, нам не нужно использовать какие-либо табуляции или пробелы.:)

В качестве других примеров можно привести nil против NULL, strlen() против -[NSString length].BOOL может сказать «Я - код Objective-C». сильно , что _Bool не может.

0 голосов
/ 03 апреля 2011

В Objective-C просто используйте тип данных BOOL ...

Для C я рекомендую следующие макросы, которые также будут работать с ANSI-C (C-89):

#ifndef __bool_true_false_are_defined
    #ifdef _Bool
        #define bool                        _Bool
    #else
        #define bool                        char
    #endif
    #define true                            1
    #define false                           0
    #define __bool_true_false_are_defined   1
#endif
...