Причины не использовать _Bool в Objective-C?

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

Весь Какао использует BOOL , как и весь код не-NeXT / Apple Cocoa, который я видел. Очевидно, что для совместимости с существующими протоколами (например, -applicationShouldTerminateAfterLastWindowClosed: из NSApplicationDelegate ), соответствие уже объявленному типу предпочтительнее, если только по той причине, чтобы предотвратить предупреждение. 12228] Для обеспечения чистоты / удобочитаемости stdbool. h определяет bool как синоним для _Bool , поэтому те из нас, кто не хочет лишних подчеркиваний в нашем коде, могут использовать это.

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

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

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

19
задан Peter Hosey 2 April 2011 в 22:45
поделиться