Почему clang stdbool.h содержит #define false false
После указания ошибки компилятора я заметил, что clang stdbool.h
содержит (среди прочего) следующие строки:
#define bool bool
#define false false
#define true true
Они содержатся в блоке #ifdef
, который косвенно поддерживает __cplusplus
, поэтому тег С++, хотя stdbool.h
является заголовком C.
Какая потребность в них определяет? Я предполагаю, что они требуются по какой-то причине, связанной с препроцессором, но мне было бы интересно узнать, какая часть стандарта или какая техническая причина делает так, чтобы это было связано с этим.
Ответы
Ответ 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>
.