Использование char как bool в C плохая практика? - PullRequest
10 голосов
/ 04 октября 2010

Есть ли минус в использовании

typedef char bool;
enum boolean { false, true };

в C для обеспечения семантического логического типа?

Ответы [ 5 ]

14 голосов
/ 04 октября 2010

В C99 вы должны использовать stdbool.h, который определяет bool, true и false.

В противном случае то, что у вас есть, хорошо. Использование только перечисления может быть немного проще, но если вы действительно хотите сэкономить место, то, что у вас есть, работает.

6 голосов
/ 04 октября 2010

Короткий ответ: все в порядке.Это особенно хорошо, если вам нужно сделать из них большие массивы, хотя я хотел бы просто использовать встроенный в C99 1 .

Так как вы спросили "есть ли любой недостаток ... "Полагаю, я мог заметить, что были важные машины, у которых на самом деле не было инструкции загрузки символов.(На ум приходят Cray и начальная DEC Alpha.) В будущем машины могут внезапно снова стать минимальными.

всегда будет быстрым для загрузки стандартного целочисленного типа.

, вероятно, всегда будет быстро загружать отдельный символ.


1.См. C99 6.2.5.Есть встроенный тип _Bool.Затем, если вы включите <stdbool.h> (см. C99 7.16), вы получите псевдоним с более изящным именем bool и определения для true и false.Если вы воспользуетесь этим, он будет конфликтовать с вашим typedef, но я уверен, что это будет легко исправить.

4 голосов
/ 04 октября 2010

Недостатком typedef char bool; является то, что если вы компилируете реализацию C99 и в нее входит <stdbool.h>, это заканчивается как typedef char _Bool;, что неверно. Кроме того, если вы когда-нибудь попытаетесь скомпилировать код как C ++, у вас будут проблемы (это не обязательно проблема, но это может быть).

Вероятно, было бы лучше использовать <stdbool.h>, если ваша реализация предоставляет его, или использовать другое имя для типа, например BOOL.

1 голос
/ 04 октября 2010

Я думаю, что это хорошо, красиво и чисто.

0 голосов
/ 04 октября 2010

Я бы предложил использовать бит для представления истинного или ложного, а не символа. Символ использует 8 бит, мы можем установить 1 для истины и 0 для ложных только с 1 битом. Это будет более эффективным с точки зрения памяти, а также удовлетворяет цели. (например, флаг char: 1;

Ссылка: http://en.wikipedia.org/wiki/Bit_field

...