Что такое 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] перечислены его как ключевое слово. На самом деле,все маркеры, которые являются частью имен интегральных типов, также являются ключевыми словами, включая (но не ограничиваясь):
intunsignedlongboolshortsigned
однако, , никогда макрос в 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.