2012-08-19 3 views
30

C++ primer에 따르면, <cstdlib> 헤더는 NULL을 정의합니다. cpluspplus<cstddef>에 정의되어 있다고 말합니다.C++에서 어떤 헤더가 NULL을 정의합니까?

궁극적으로 오른쪽 헤더가 포함되어 있지 않으면 NULL을 참조 할 수 없다고 생각했습니다. 내가 무엇을 볼 수에서

그러나 그것은 참조 및 프로그램을 생산하고 그에만 <iostream>

포함 날이 이해를 도와주세요 후, 컴파일하고 경고 또는 오류없이 실행할 수 있습니다.

+6

BTW 대신 nullptr을 사용해야합니다. – wjl

+2

괜찮습니다.하지만 질문에 대답하지 않습니다. –

+2

@wjl : C++ 03에서도 'NULL'보다는 '0'을 사용하는 것이 좋습니다. –

답변

19

C++ 03 섹션 18.1.2는 NULL이 cstddef에 정의되어 있다고 표시한다.

일부 구현에서 iostream은 cstddef를 포함 할 수 있으므로 iostream을 포함하여 NULL도 제공됩니다.

3

그것은 테이블 (30) 그것은 말한다 <cstddef>에서 무엇을 설명하고, <cstddef>

에서 C++ 11 표준 섹션 18.2을 정의됩니다

표 30 - 헤더 <cstddef> 개요

매크로 : NULL [...]

[...] 매크로 NULL 이 국제 표준에서 구현 정의 C++ 널 포인터 상수이다.

+0

질문에 대답하지 않습니다. 가치는 구현이 정의한 것이며 존재하지는 않습니다. –

+0

위의 두 가지가 모두 포함되어 있지 않은데 왜 Okay가 작동합니까? –

+0

@JamesLeonard : 다른 헤더는 ''을 포함 할 수 있습니다. – Cornstalks

29

C 표준은 NULL이 locale.h, stddef.h, stdio.h, stdlib.h, string.h, time.hwchar.h에 정의해야합니다.

C++ 표준에서는 각 해당 문자에 해당하는 c* 헤더에 NULL을 정의해야합니다.

C 표준은 표준이 정의 할 수있는 이름에 대해 매우 엄격합니다. 각 표준 헤더는 표준에서 헤더가 정의하는 데 필요한 이름을 정확하게 정의해야합니다. 정의 할 수있는 유일한 다른 이름은 밑줄로 시작하여 밑줄이나 대문자가 오는 것과 같이 구현을 위해 예약 된 이름입니다.

C++ 표준은이 점에서 훨씬 더 관대합니다. 하나의 표준 헤더가 다른 표준 헤더를 포함하는 것과 동일한 효과를 가질 수 있습니다.

실용적인 견지에서 볼 때, C++ 구현은이 허용 성의 장점을 꽤 많이 사용했습니다. 즉, 하나의 표준 헤더를 포함하여 다른 여러 표준 헤더의 이름을 자주 정의했습니다. 보다 최근의 구현은 C 표준이 요구하는 것보다 더 많이 작동하는 경향이 있습니다. 각 헤더에 더 가깝게 머무르는 것은 헤더에 의해 정의되는 데 필요한 이름 만 정의합니다. 그것들은 C 표준이 요구하는 것만 큼 엄격하지는 않지만 아마도 (이전처럼) 훨씬 더 가깝습니다.

3

C++ 11 표준에 따르면 NULL을 여러 파일에 정의해야한다고 나와 있습니다.그들은 :

<clocale> 
<cstddef> 
<cstdlib> 
<cstring> 
<ctime> 
<cwchar> 

이이 표준의 제 C.3 C 표준 라이브러리/3 표 149에 언급되어있다.

다음은 테이블 이미지와 주변 텍스트입니다. 는 MinGW의 최신 버전에서

enter image description here

-3

(는 MinGW 5.3.0) NULL이 같은 wchar.h 헤더에 정의 : C++ (11), NULL이 완전히되지 않습니다에,

#define NULL 0 
+0

이 질문은 특정 컴파일러에 관한 것이 아닙니다. R Sahu의 대답을보십시오 –

+0

이것은 또한 이미'wchar.h' (또는'cwchar')가이 정의를 가지고 있음을 우리에게 알려주는 _four years ago_만큼 기존 답변에 아무 것도 추가하지 않습니다. –

관련 문제