Почему C булевы называются _Bool?

Почему C использует слово _Bool для определения булевых значений? В то время как они используют слово float для поплавков, а не _Float?

Кроме того, почему нужно включить bool, почему не является частью базовых функций, например float?

Ответы

Ответ 1

_Bool первоначально не был в C, но был добавлен в стандарте C 1999 года. Если бы это было вызвано bool, тогда большой объем существующего кода сломался бы, потому что многие проекты уже сделали свой собственный псевдоним типа bool.

В стандарте C89 указаны идентификаторы, начинающиеся с _, за которым следует символ верхнего регистра, зарезервированный для использования. Вот почему новые функции, добавленные в C, всегда начинаются с таких имен. _Complex, _Alignof и _Static_assert - другие примеры.

Существует также заголовок <stdbool.h>, который псевдонимы bool до _Bool и определяет true и false; этот заголовок может быть включен в новые проекты или проекты, которые еще не определили bool.

Ответ 2

Что касается...

Кроме того, почему нужно включать bool, почему не является частью базовые функции, такие как float?

... Я заметил, что, хотя вам нужно включить stdbool.h, чтобы получить bool, что удобство и функция совместимости с С++ не являются существенными. bool является псевдонимом для _Bool, а в C99 и позже у вас есть _Bool автоматически, но даже это несущественно. В C любое целое число или значение указателя могут быть интерпретированы как логические, причем 0 или NULL интерпретируются как ложные, а все другие значения интерпретируются как истинные. Именно так булево значение было обработано в C с самого начала, и оно по-прежнему работает в реализациях, соответствующих последнему стандарту.

Фактически, тип _Bool сам по себе является лишь особым случаем такого поведения: он представляет собой целочисленный тип, минимальные требования которого состоят в том, чтобы он мог представлять значения 0 и 1. В булевом контексте он работает только с как и любой другой целочисленный тип.

Ответ 3

C первоначально не имел типа Boolean, он был добавлен в версии 1999 года на языке (C99). В этот момент С++ уже был стандартизован (в 1998 году) для использования типа bool с ключевыми словами false и true. Чтобы сохранить тип C Boolean отдельно от того, который был на С++, а также не допустить, чтобы новое имя нарушало старый код C, оно было названо _Bool.

Причина, по которой он был назван с подчеркиванием, за которым следует буква верхнего регистра, заключается в том, что такой идентификатор уже гарантированно не существовал в компиляторе, библиотеке или коде пользователя, в соответствии с 7.1.3:

Все идентификаторы, начинающиеся с символа подчеркивания, и буква верхнего регистра или другое подчеркивание, всегда зарезервированы для любого использования.

"Зарезервировано для любого использования" означает зарезервированное для будущих версий языка C.

Поэтому все новые языковые ключевые слова, которые были добавлены на язык с C99, называются с подчеркиванием, за которым следует верхний регистр первой буквы. Другими примерами из C99 являются типы _Complex и _Imaginary.


Для случаев, когда требуется совместимость кода с С++, был создан заголовок <stdbool.h>. Он содержит макрос bool, который расширяется до _Bool. А также макросы false и true, которые расширяются до 0 и 1.

Хотя обратите внимание, что логические элементы не полностью интегрированы в язык C, так как они находятся на С++. В С++ выражение, такое как a == b, дает результат типа bool со значением true или false. В C он дает результат типа int со значением 1 или 0. Это связано с соображениями обратной совместимости со старым кодом C.