NULL이 선언되지 않은 이유는 무엇입니까?


87

이 코드를 컴파일하려고 할 때이 구조체 생성자에 문제가 있습니다.

typedef struct Node
{
    Node( int data ) //
    {
        this->data = data;
        previous = NULL; // Compiler indicates here
        next = NULL;
    }

    int data;
    Node* previous;
    Node* next;
} NODE;

내가 올 때이 오류가 발생합니다.

\linkedlist\linkedlist.h||In constructor `Node::Node(int)':|
\linkedlist\linkedlist.h|9|error: `NULL' was not declared in this scope|
    ||=== Build finished: 1 errors, 0 warnings ===|

마지막 문제는 구조체 였지만 main.cpp에있을 때는 잘 작동했습니다. 이번에는 헤더 파일에 있으며이 문제를 발생시킵니다. 이 코드를 컴파일하기 위해 Code :: Blocks를 사용하고 있습니다.

답변:


139

NULLC 또는 C ++ 언어의 내장 상수가 아닙니다. 사실, C ++에서는 다소 쓸모가 없습니다. 0대신 일반 리터럴을 사용하면 컴파일러가 컨텍스트에 따라 올바른 작업을 수행합니다.

최신 C ++ (C ++ 11 이상)에서는 nullptr(주석에서 지적한대로) 사용하십시오.

그렇지 않으면 추가

#include <stddef.h>

NULL정의 를 얻으려면 .


7
NULL은 stdlib.h가 아니라 stddef.h의 일부입니다. 기술적으로, stdlib.h의 일부로 얻을 수 있다는 보장은 없지만 그렇지 않으면 꽤 놀라 울 것입니다.
CB Bailey

8
NULL은 stddef.h, stdlib.h, stdio.h, locale.h, string.h 및 time.h (C99를 계산하는 경우 wchar.h)와 같은 C 헤더에 정의되어 있습니다.
Michael Burr

8
<cstddef>더 깨끗한 옵션입니다.
Fred Foo

29
"NULL"을 의미 할 때 "0"을 사용하지 마십시오! 이 차이는 : 의미. 컴파일러가 당신이 그것을 피할 수 있도록 허용하더라도, 무엇인가를 알고 올바른 단어를 사용하는 것의 중요성을 결코 과소 평가하지 마십시오!
imallett 2013

13
@ 6502 그것에 대해 말하지 않고; 0과 NULL은 항상 같은 값 (거의)을 가지므로 '\ 0'또는 0을 사용하면 실수로 작동합니다. 문제는 의미론입니다. NULL을 사용하면 값이 단순한 정수가 아니라 포인터라는 의미이므로 더 표현력이 좋습니다.
imallett 2013-08-30

34

NULL을 사용하십시오. 어쨌든 0으로 정의되고 의미 상 정수 0과 구별하는 것이 매우 유용합니다.

0 (따라서 NULL)을 사용하는 데 문제가 있습니다. 예를 들면 :

void f(int);
void f(void*);

f(0); // Ambiguous. Calls f(int).

다음 버전의 C ++ (C ++ 0x)에는 nullptr이 문제를 해결하기 위해 포함 됩니다.

f(nullptr); // Calls f(void*).

5
((void *)0)대부분의 C 표준 라이브러리 구현 으로 정의됩니다 .
Triang3l 2013 년

1
이것은 주제와 관련하여 내가 읽은 가장 짧은 대답 (기술적으로 정확함)입니다 : NULL 대 0 대 nullptr. 감사합니다!
jose.angel.jimenez

2
@SiPlus가 ((void *)0)있기 때문에, C ++에서 잘못된 void*다른 포인터 타입으로는 예를 들어, C. glibc에있는 방법을 강제 할되지 않습니다 않는 #define NULL 0경우 __cplusplus정의됩니다.
rpjohnst

16

NULL핵심 C ++ 언어의 기본 부분은 아니지만 표준 라이브러리의 일부입니다. 정의를 포함하는 표준 헤더 파일 중 하나를 포함해야합니다. #include <cstddef>또는 #include <stddef.h>충분해야합니다.

또는 NULL을 포함하면 의 정의를 사용할 수 있습니다 . 보장되지는 않지만 대신 다른 표준 헤더를 많이 포함하면 정의가 포함될 가능성이 큽니다.cstddefstddef.h


12

이 파일에 "stdlib.h"또는 "cstdlib"를 포함하고 있습니까? NULL은 stdlib.h / cstdlib에 정의되어 있습니다.

#include <stdlib.h>

또는

#include <cstdlib>  // This is preferrable for c++

2
NULL은하지 stdlib.h stddef.h와의 일부입니다
awiebe

@awiebe 5 분 전까지 생각했던 것입니다. C99에 따르면 꽤 많은 다른 헤더 파일이 그것을 정의해야합니다. 섹션 7.17에는 stddef.h가 필요하고 7.20에는 stdlib.h에 필요하며 아마도 다른 몇 가지가있을 것입니다.
AJM-Reinstate-Monica

4

사용하지 마십시오 NULL. C ++를 사용하면 장식 0되지 않은 것을 대신 사용할 수 있습니다 .

previous = 0;
next = 0;

그리고, C ++ 11에서, 당신은 일반적으로 하나 사용하지 않아야 NULL 또는 0 그것이 당신을 제공하기 때문에 nullptr유형의 std::nullptr_t더 나은 작업에 적합합니다.


33
NULL은 정수 상수가 아닌 널 포인터 상수를 사용하려는 유용한 문서라고 생각하는 경향이 있습니다. 비록 0을 사용하는 것을 반대하지는 않습니다. 현재로서는 실질적인 이점을 얻지 못함을 인정하겠습니다. , 그러나 다음 C ++ 버전을 채택하면 새로운 nullptr 상수를 사용하도록 변경하는 것이 좋습니다.
CB Bailey

1
물론 두 분 모두 동의합니다. 덧붙여서, 하나의 문서가 포인터를 사용하는 것도 좋지만, 실제로 정수를 입력하는 좋은 문서도 좋습니다. printf ( "% p \ n", NULL); // OH, UB. 또는 두 개의 과부하가있는 경우 void f (int); 무효 f (무효 *); 당신은 f (NULL); 통화를 빠르게 살펴볼 때 void * 버전을 호출합니다. f (0); 그것은 실제로 INT 버전을 호출합니다,하지만 당신은 당신이 포인터 :( 좋은를 전달하려는 사실을 문서화하지 않을 것이라는 사실을 문서화 할 것 nullptr 수정이 :)
요하네스 SCHAUB - litb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.