2012-08-31 2 views
0

gcc가 제공 한 헤더 stddef.h를 읽을 때 실수가있을 수 있음을 발견했습니다. 처음에는 실수라고 생각합니다. 그러나 gcc (3.4.5, 4,4,3 및 4,6,3) 세 가지 버전의 stddef.h 헤더를 읽은 후에는 그 점이 동일하다는 것을 알았으므로 확실하지 않습니다. 아마 내가 틀렸어.헤더의 가능한 실수 stddef.h

#if (!defined(_STDDEF_H) && !defined(_STDDEF_H_) && !defined(_ANSI_STDDEF_H) \ 
    && !defined(__STDDEF_H__)) \ 
    || defined(__need_wchar_t) || defined(__need_size_t) \ 
    || defined(__need_ptrdiff_t) || defined(__need_NULL) \ 
    || defined(__need_wint_t) 

위의 코드는 stddef.h와의 시작입니다. 다음은 stddef.h의 끝입니다. 한 쌍이 있습니다. 단어가

 || __need_XXX was not defined before */ 

을 삭제할 수 "없습니다"해야 :

#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__ 
     || __need_XXX was not defined before */ 

나는 라인에 실수가 있다고 생각하십니까?

실수는 있지만 실수가 발견되지 않고 변경된 이유는 무엇입니까?

답변

1

사실 버그는 아니지만 화장품과 같은 사마귀는 아닙니다.

  1. 그것은 주석에 컴파일러가 보는 무엇에 영향을 (사전 프로세서가 주석을 제거)이 없습니다.

  2. 이 주석은 '이 다양한 정의가 전에 정의되지 않았습니다'라고 말합니다. 인

    (_STDDEF_H 정의되지 않았고 _STDDEF_H_ 정의되지 않았고 _ANSI_STDDEF_H 정의되지 않았고 __STDDEF_H__ 정의되지 않은) 우리는 여전히 다양한 __need_XXX 기능 중 하나가 필요한 경우 OR을 다음 헤더 본체 처리 된 . || 조항이 추가되기 전에는 명확 해졌습니다. 헤더 파일을 식별하는 정의 된 기호 세트보다 나중에 추가되었을 것입니다.

은 주석의 언어가 더 정확한 만들 수있는, 부여하지만, 약자가 수행되는 방식과 매우 유사하다. 어느 #if #endif을 참조하는 것이 분명하다. 제안 된 패치를 제출할 수는 있지만 그다지 아무런 변화가 없다면 놀라지 마십시오. 내 헤더와 내가 훨씬 복잡, 아마 같은 것을 사용하는 거라고 필요한 경우 :

#endif /* (!_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__) || __need_XXX */ 

을 내가 사용하는 유혹 될 수 있습니다 역사의 많은 그 의견에있다

#endif /* (!_STDDEF_H && !_STDDEF_H_ && ...) || __need_XXX || ... */ 

의심의 여지가 없다. 시스템 헤더는 배우기에 좋은 장소가 아닙니다. 그들은 다양한 표준 집합에 의해 동시에 여러 방향으로 구동되기 때문에 이해하기 어려운 경향이 있으며, 표준이 발전함에 따라 시간이지나면서 합병증을 유발합니다.

+0

답장을 보내 주셔서 감사합니다. "용어가 추가되기 전에 헤더 파일을 식별하는 정의 된 기호 세트보다 나중에 추가 된 것 같습니다." 자세히 설명해 주시겠습니까? – junwanghe

+0

내가 그 옛날에 조건이 &&! 정의 &&! 정의 (_STDDEF_H) (_STDDEF_H_) (_ANSI_STDDEF_H) 정의'의 #if를! 읽는 가정하고있어 &&! 정의 (__ STDDEF_H __)'다음'__need_XXX' 옵션이 추가되었습니다, 원 상태를 중심으로 괄호가 필요하고 추가 조건을 요구하는 경우. '__need_XXX' 조건을 생략하면, 닫은 구는 의미가 있습니다.파일에 진입 할 때 조건이 충족되지 않았습니다. 나중에,'__need_XXX' 용어가 추가되었지만, 주석의 문구가 문법적으로 정확하도록 완전히 조정되지 않았습니다. –