Подтвердить что ты не робот

Почему clang stdbool.h содержит #define false false

После указания ошибки компилятора я заметил, что clang stdbool.h содержит (среди прочего) следующие строки:

#define bool  bool
#define false false
#define true  true

Они содержатся в блоке #ifdef, который косвенно поддерживает __cplusplus, поэтому тег С++, хотя stdbool.h является заголовком C.

Какая потребность в них определяет? Я предполагаю, что они требуются по какой-то причине, связанной с препроцессором, но мне было бы интересно узнать, какая часть стандарта или какая техническая причина делает так, чтобы это было связано с этим.

4b9b3361

Ответ 1

stdbool.h является заголовком C, а не заголовком С++. Обычно он не встречается в программах на С++, потому что true и false уже являются ключевыми словами в С++.

Следовательно, если программа на С++ включает stdbool.h, это довольно четкое указание на то, что это программа с портированным кодом C (например, программа C, которая скомпилирована как С++). В этом случае g++ поддерживает stdbool.h в режиме С++ в качестве расширения GNU в комментариях GCC stdbool.h:

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool        bool
#define bool        bool
#define false        false
#define true        true

...

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined        1

Clang также поддерживает stdbool.h в С++ для совместимости с g++. Значения преднамеренно определены здесь, чтобы соответствовать встроенному типу С++, а не традиционным определениям C99. Они определены как макросы, предположительно, для обеспечения совместимости с C99 стандартом, который требует:

Заголовок должен определять следующие макросы: bool, true, false, __bool_true_false_are_defined.

Приложение может деинфинировать, а затем, возможно, переопределить макросы bool, true и false.

Ответ 2

Он был добавлен в suport режим GNU в С++, как мы можем видеть из этого патча [cfe-commits] r115028:

Определите _Bool, bool, true и false макросы, когда мы в GNU-совместимом диалекте С++. Исправления < rdar://проблема/8477819 > .

поэтому gcc поддерживает это как расширение, и эта модификация была сделана для поддержки этого расширения.

Хотя я не могу найти исходный отчет о проблеме, упомянутый в патче.

Это несоответствие, как мы видим из стандартного раздела проекта С++ 11 18.10 Другая поддержка времени выполнения [support.runtime]:

Заголовок <cstdbool> и заголовок < stdbool.h > не должны определить макросы с именем bool, true или false.

но gcc не должен строго соответствовать режиму GNU.

stdbool.h является частью C99 и поэтому не поддерживается стандартом С++ до тех пор, пока С++ 11, который в приложении D не говорит:

Для совместимости с стандартной библиотекой C и C Unicode TR, стандартная библиотека С++ предоставляет заголовки 25 C, как показано в таблице 154

и включает <stdbool.h>.