Что такое 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++, я не уверен, что могу придумать полезный пример, заметь.


В C bool макрос от stdbool.h что расширяется до _Bool что это с типа boolean.


Так что же такое 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 макросы.

  1. bool, который расширяется до _Bool
  2. true который расширяется до 1
  3. false, который расширяется до 0
  4. __bool_true_false_are_defined, который расширяется до 1.