clang의 stdbool.h에 #define false false가 포함 된 이유
컴파일러 오류로 지적 된 후 clang의 stdbool.h
파일에 다음 줄이 포함되어 있음을 알았습니다 .
#define bool bool
#define false false
#define true true
간접적으로 #ifdef
적용 되는 블록에 포함되어 __cplusplus
있으므로 stdbool.h
C 헤더 인 경우에도 C ++ 태그 가 사용됩니다.
그 정의에 대한 필요성은 무엇입니까? 나는 그것들이 전 처리기 관련 이유로 필요하다고 생각하지만 표준의 어떤 부분이나 어떤 기술적 이유 때문에 clang이 그것들을 포함 해야하는지 알고 싶습니다.
stdbool.h
C ++ 헤더가 아니라 C 헤더입니다. 때문에 일반적으로 C ++ 프로그램에서 발견되지 true
및 false
C 키워드 이미 ++.
결과적으로 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라는 매크로를 정의하지 않아야합니다.
그러나 gcc
GNU 모드에서 엄격하게 준수하는 것은 아닙니다.
stdbool.h
C99의 일부이며 그래서에서 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
'Program Tip' 카테고리의 다른 글
지역 가치와 마스터 가치의 차이점은 무엇입니까 (0) | 2020.12.05 |
---|---|
browserify / requirejs 모듈과 ES6 모듈의 차이점은 무엇입니까? (0) | 2020.12.05 |
바벨 대 바벨 코어 대 바벨 런타임 (0) | 2020.12.05 |
임시 개체 반환 및 const 참조에 바인딩 (0) | 2020.12.05 |
:: PostgreSQL에서 무엇을합니까? (0) | 2020.12.05 |