오류 :이 범위에서 'NULL'이 선언되지 않았습니다.


119

gcc 4.3에서 C ++를 컴파일 할 때이 메시지가 나타납니다.

error: NULL was not declared in this scope

나타나고 사라지고 이유를 모르겠습니다. 왜?

감사.


2
아마도 메시지가 오는 곳의 범위에서 NULL을 선언하지 않았습니까?
Paul Tomblin

1
오류를 발생시키는 전체 코드를 게시해야합니다. 그렇지 않으면 오류 문자열 만보고 무슨 일이 일어나고 있는지 알기가 매우 어려울 것입니다.
Naveen

답변:


178

NULL키워드가 아닙니다. 일부 표준 헤더에 정의 된 식별자입니다. 포함 할 수 있습니다.

#include <cstddef>

.NET과 같은 다른 기본 사항을 포함하여 범위에 포함 std::size_t됩니다.


하나님, 나는 Java (null이 키워드)에 너무 빠져서 NULL이 C ++의 키워드가 아니라고 생각하지 못했습니다. 감사합니다 :)
Stefan Hendriks 2011 년

14
사실 Java에서도 키워드가 아닙니다.
Man of One Way

4
@ManofOneWay 아니요, Java에 존재하며 대문자 대신 모두 소문자로 표기됩니다.
Ataraxia 2013 년

8
@ZettaSuro 존재하지 않는다고 말하지 않았습니다. 그냥 키워드가 아니라고 했어요.
Man of One Way

8
이제 C ++ 11이 컴파일러에서보다 일반적으로 지원 nullptr되므로 실제 키워드이고 #includes가 필요하지 않은 키워드를 언급 할 가치가 있습니다 . 또한 NULL.
templatetypedef

38

GCC는 C ++ 11을 향한 조치를 취하고 있으므로 NULL 상수 를 사용 하려면 이제 cstddef 를 포함해야합니다 . C ++ 11에서 선호되는 방법은 버전 4.6부터 GCC에서 구현 된 새로운 nullptr 키워드 를 사용하는 것 입니다. nullptr 은 암시 적으로 정수 형식으로 변환 할 수 없으므로 포인터 및 정수 형식 모두에 대해 오버로드 된 함수에 대한 호출을 명확하게하는 데 사용할 수 있습니다.

void f(int x);
void f(void * ptr);

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.

1
하지만 여전히 이상한 행동입니다! -std = c ++ 98 GCC로 내 코드를 컴파일해도 여전히 NULL 매크로를 인식하지 못하며 -std에 대한 인수로 c ++ 11 또는 gnu ++ 11을 사용하여 nullptr 만 인식합니다.
파라오

2
C ++ 표준은 이미 1998 년에 NULL이 cstddef에 정의되어 있다고 명시했습니다. 새 컴파일러 버전은 nullptr을 구현해야하기 때문에 표준을 더 엄격하게 따릅니다. (결함이있는) 코드는 이전 GCC 버전으로 컴파일되었지만 이전 C ++ 표준 버전 외에도 이전 GCC 버전과 역 호환성을 유지하기가 어려울 것입니다.
Seppo Enarvi

NULL내장 키워드가 아닙니다. <stddef.h>(또는 <cstddef>)을 포함하여 여러 표준 C 헤더에 정의 된 매크로 입니다. gcc가 "C ++ 11을 향한 발걸음"이 어떻게 영향을 줍니까? 질문에서 (보이지 않는) 코드가 이전 버전의 gcc / g ++ 또는 이전 버전의 언어 표준으로 컴파일되었음을 의미하는 것은 없습니다.
Keith Thompson

1
그것은 내가 위에서 말한 것입니다 : 이미 C ++ 98에서는 cstddef에 정의되었습니다. 여전히 gcc (및 다른 컴파일러도)는 cstddef를 먼저 포함하지 않고 NULL을 사용하는 코드를 허용했습니다. 엄격한 표준 준수는 아니지만 이전 버전으로 컴파일 된 문제의 (보이지 않는) 코드도 확신합니다. 이제 저는 최신 버전의 이러한 더 엄격한 동작이 C ++ 11 구문을 지원하는 컴파일러의 개발 때문이라고 추측하고 있습니다.
Seppo Enarvi 2013 년

10

NULL키워드가 아닙니다. 그것은 0에 대한 매크로 대체이며 stddef.h또는 들어옵니다 cstddef. 당신이하지 않은 #includedg ++에서 볼 수 있도록, 적절한 헤더 파일을 NULL일반 변수 이름으로, 당신은 그것을 선언하지 않았습니다.


5

다른 답변을 완료하려면 : C ++ 11을 사용 nullptr하는 경우 null을 가리키는 void 포인터를 의미하는 키워드 인를 사용하십시오. ( NULL포인터 유형이 아닌 대신 )


0

NULL은 다음에서도 찾을 수 있습니다.

#include <string.h>

String.h는 다른 곳에서 NULL을 가져옵니다.


0

매크로를 NULL로 선언 할 수 있습니다. #includes 뒤에 추가하십시오.

#define NULL 0

또는

#ifndef NULL
#define NULL 0
#endif

아니 ";" 지침 끝에 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.