Что такое bool в C / C++? Ключевое слово или макрос?
Я говорил этот вопрос, в котором некоторые из ответов предполагают, что bool
является интегральным типом (IDEs также рассматривают его как ключевое слово).
однако ни один из ответов не предлагает информацию, представленную в cplusplus, который говорит, что bool
- это макрос, который добавляется через <cstdbool>
(в этом случае компиляторы могут неявно добавлять этот заголовок при компиляции, чтобы разрешить bool
). Вот версия g++ <stdbool.h>
.
так, что именно bool
- Это? Ключевое слово интегрального типа или макрос?
6 ответов
В C,bool
макрос.
нет встроенного типа или ключевого слова по имени bool
В C, поэтому типичные реализации используют стандартную библиотеку для #define
true
и false
до 1
и 0
соответственно. Правила, например,if
оператор определяется в терминах" нулевых "и" ненулевых " выражений и поэтому полагается на расширенные определения макросов true
и false
:
[C99: 6.8.4.1/2]:
в обеих формах, первая подстановка выполняется, если выражение сравнивается неравным 0. В форме else вторая подстановка выполняется, если выражение сравнивается равным 0. Если первая подстанция достигается через метку, вторая подстанция не выполняется.
для удобства C99 добавил встроенный промежуточный тип _Bool
, и реализации этого языка обычно #define
bool
до _Bool
. Этот тип определяется следующим образом:
[C99: 6.2.5/2]:
объект, объявленный как тип_Bool
достаточно большой, чтобы хранить значения 0 и 1.
это позволяет обеспечить большую совместимость с программами на C++, которые могут включать объявления функций с помощью bool
тип; действительно, хотя, #define _Bool int
вероятно, было бы достаточно.
В C++, bool
является встроенным типом и ключевым словом.
ссылка, которую вы предоставили, не говорит, что bool
- это макрос на C++. Он говорит:
цель в C этого заголовка-добавить тип bool и значения true и false в качестве определений макросов.
в C++, который поддерживает их напрямую, заголовок просто содержит макрос, который можно использовать для проверки, поддерживается ли тип.
и это правильно.
семантически (то есть с точки зрения "значения" вашего кода),[C++11: 3.9.1/2]
определяет bool
в качестве составной тип в С.++
лексически (то есть с точки зрения "внешнего вида" в вашем коде),[C++11: 2.12/1]
перечислены его как ключевое слово. На самом деле,все маркеры, которые являются частью имен интегральных типов, также являются ключевыми словами, включая (но не ограничиваясь):
int
unsigned
long
bool
short
signed
однако, , никогда макрос в C++. Вместо этого вы получаете макрос __bool_true_false_are_defined
который вы можете использовать в многоязычном коде для переключения обработки bool
в зависимости от того, работаете ли вы в C или C++, я не уверен, что могу придумать полезный пример, заметь.
Так что же такое bool? Ключевое слово интегрального типа или макрос?
В C++ это называется логический литерал, он встроен в тип.
§2.14.7
типы bool, char, char16_t, char32_t, wchar_t, а также целочисленные типы со знаком и без знака совместно называются интегральные типы.
§2.14.6
логические литералы
boolean-literal:
false
true
Логическое литералы-это ключевые слова false и правда. Такие литералы являются prvalues и имеют тип bool.
§ 3.9.1.6
значения типа bool имеют значение true или false. [ Примечание: нет подписанных, неподписанных, коротких или длинных типы или значения bool. - end note ] значения типа bool участвуют в интегральных акциях (4.5).
В C++ bool
-это встроенный тип данных. В C это не так, поэтому, если вы используете bool
В C он был реализован как typedef или с #define
и true
и false
должно быть реализовано с #define
или, возможно, являются константами.
В C нет такой концепции, как булевы переменные, да языки более высокого уровня, такие как Java, C# и другие, предоставляют нам возможность объявить булеву переменную, которую мы используем для целей пометки, чтобы установить ее либо true, либо false.
но вы можете реализовать это с помощью интегралов, как мы делали в C
if(1)
{
// Because C treats 1 and any other integer as true
}
if(0)
{
// This time our if condition will result in false
}
In C _Bool
тип и bool
, true
и false
макросы, определенные в stdbool.h
стандартные состояния ISO C11 (в разделе 6.2.5 типы )
объект, объявленный как тип _Bool, достаточно велик для хранения значений 0 и 1.
stdbool.h
определяет 4 макросы.
-
bool
, который расширяется до_Bool
-
true
который расширяется до1
-
false
, который расширяется до0
-
__bool_true_false_are_defined
, который расширяется до1
.