Program Tip

clang의 stdbool.h에 #define false false가 포함 된 이유

programtip 2020. 12. 5. 10:28
반응형

clang의 stdbool.h에 #define false false가 포함 된 이유


컴파일러 오류로 지적 된 후 clang의 stdbool.h파일에 다음 줄이 포함되어 있음을 알았습니다 .

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

간접적으로 #ifdef적용 되는 블록에 포함되어 __cplusplus있으므로 stdbool.hC 헤더 인 경우에도 C ++ 태그 가 사용됩니다.

그 정의에 대한 필요성은 무엇입니까? 나는 그것들이 전 처리기 관련 이유로 필요하다고 생각하지만 표준의 어떤 부분이나 어떤 기술적 이유 때문에 clang이 그것들을 포함 해야하는지 알고 싶습니다.


stdbool.hC ++ 헤더가 아니라 C 헤더입니다. 때문에 일반적으로 C ++ 프로그램에서 발견되지 truefalseC 키워드 이미 ++.

결과적으로 C ++ 프로그램에 포함 된 stdbool.h경우 포팅 된 C 프로그램 (예 : C ++로 컴파일되는 C 프로그램)이라는 매우 분명한 표시입니다. 이 경우 G ++는 GCCstdbool.h 의 주석에 따라 C ++ 모드에서 GNU 확장으로 지원합니다 .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 ++와의 호환성을 위해 C ++에서 지원합니다 . 값은 전통적인 C99 정의가 아닌 기본 제공 C ++ 유형과 일치하도록 여기서 의도적으로 정의됩니다. 이들은 아마도 C99 표준 과의 호환성을 제공하기 위해 매크로로 정의되며 다음이 필요합니다.

헤더는 다음과 같은 정의해야한다 매크로 : bool, true, false, __bool_true_false_are_defined.

응용 프로그램은 정의를 해제 한 다음 bool, true 및 false 매크로를 재정의 할 수 있습니다.


이 패치 [cfe-commits] r115028 에서 볼 수 있듯이 C ++의 지원 GNU 모드에 추가되었습니다 .

GNU 호환 C ++ 언어에있을 때 _Bool, bool, true 및 false 매크로를 정의하십시오. <rdar : // problem / 8477819>를 수정합니다.

그래서 gcc이것을 확장으로 지원하고이 수정은 그 확장을 지원하기 위해 만들어졌습니다.

패치에 언급 된 원래 문제 보고서를 찾을 수 없지만.

이것은 C ++ 11 표준 섹션 18.10기타 런타임 지원 [support.runtime] 초안에서 볼 수 있듯이 부적합 합니다 .

헤더 <cstdbool> 및 헤더 <stdbool.h>는 bool, true 또는 false라는 매크로를 정의하지 않아야합니다.

그러나 gccGNU 모드에서 엄격하게 준수하는 것은 아닙니다.

stdbool.hC99의 일부이며 그래서에서 C ++ 11까지 C ++ 표준에서 지원되지 않습니다 부속서 D는 말합니다 :

C 표준 라이브러리 및 C Unicode TR과의 호환성을 위해 C ++ 표준 라이브러리는 표 154에 표시된대로 25 개의 C 헤더를 제공합니다.

<stdbool.h>.

참고 URL : https://stackoverflow.com/questions/30875069/why-does-clangs-stdbool-h-contain-define-false-false

반응형