문제

의 초기에는 C++되었을 때 도망에서의 상단에,당신은 당신을 사용할 수 없습으로 NULL 이었으로 정의 (void*)0.할당할 수 없습 NULL 어떤 포인터 이외의 다른 void*, 는 그것의 종류를 쓸모가 없다.당시에 그것이 허용하는 당 사용 0 (zero)null 포인터입니다.

이 날을 위해,나는 계속 사용하여 제로 null pointer 지만 주변 사람들에게 주장하고 사용하기에 NULL.나 개인적으로 보이지 않는 어떤 혜택을 주는 이름을(NULL 함)을 기존의 가치를 이루고 내가 또한 테스트 포인터를 진리로 값:

if (p && !q)
  do_something();

다음을 사용하여 제로 더 많은 의미가(로에서 사용하는 경우 NULL, 할 수 없는 논리적으로 사용 p && !q -당신은 당신을 명시적으로 지정할 필요가에 대해 비교 NULL, 지 않는 한,당신 가정 NULL 로,어떤 경우에 사용하는 이유 NULL).

어떤 목적을 이유로 선호하는 영상 NULL(또는 그 반대로),또는 모든 개인적인 기호?

편집:추가해야(그리고 미래를 말)는 RAII 및 예외에,나는 거의 사용하지 않는 경우 제로/NULL 포인터지만,때때로 당신은 그들이 필요합니다.

도움이 되었습니까?

해결책

여기 이후에 이: C++스타일과 기술 FAQ

C++에서의 정의 NULL 0 다,그래서만 있는 심미적인 차이입니다.난을 피하기 위해 선호하는 매크로,그래서 나 0 을 사용합니다.또 다른 문제 NULL 는 사람들은 때때로 잘못 생각과는 다른 것입 0 고/또는 정수가 아닙니다.사전 표준 코드 NULL 었/은 때때로 정의가 적합하지 않으며 따라서 있었/을 피할 수 있습니다.는 더 적은 일반적인 이러한 일입니다.

이 있는 경우 이름을 널 포인터,전화 nullptr;that's what it's 이라는 C++에서 11.그런 다음 nullptr 이 될 것입니다.

는 말했다,없는 작은 물건입니다.

다른 팁

거기에 몇 가지 인수(중 하나는 비교적 최근의)내가 믿는 모순을 비얀의 위치에서이다.

  1. 문서의 의도

NULL 할 수 있습 검색어에 대해 그것의 사용 그리고 그것은 또한 하이라이트는 개발자 NULL 포인터와 관계없이 되 고 있는지 여부에 의해 해석 컴파일러로 NULL 나지 않습니다.

  1. 과부의 포인터'int'은 상대적으로 드물

예제는 모두 따옴표:

void foo(int*);
void foo (int);

void bar() {
  foo (NULL);  // Calls 'foo(int)'
}

그러나,적어도 제 생각에는,문제에 위의지는 우리가 사용하는 NULL 을 위해 null 일정한 포인터,그것은 우리는 우리의 오버로드'foo'는 매우 다양한 종류의 인수입니다.매개 변수이어야 int 도,다른 어떤 유형으로 발생한 전화를 생성하는 도움이 되는 컴파일러 경고하고 있다.

  1. 분석 도구를 도울 수 있는 오늘!

도의 부재에서는 C++0x 사용할 수 있는 도구가 있습니다 오늘날 사용할 수 있다는 것을 입증하는 NULL 에 사용되는 포인터,고 0 에 사용되는 필수적인 형식입니다.

  1. C++11 새로운 std::nullptr_t 유형입니다.

이것은 새로운 논쟁이 있습니다.의 문제 0NULL 되고 적극적으로 해결을 위한 C++0x,그리고 보장할 수 있습에 대한 모든 구현을 제공하는 NULL, 매우 먼저 그들이 할 것이다:

#define NULL  nullptr

를 사용하는 사람들 NULL0, 변경 될 것입니다 개선형-안전하거나 없는 노력으면 아무것도 잡을 버는 사용 NULL0.누구나 사용 0 오늘입니다....erm...물론 희망을 그들은 그 많은 지식을 가지고 있는 표준 정규표현식을...

사용 NULL 입니다.NULL 로 보여줍니다.는 0 이 세부 구현해야 하는 중요하지 않습니다.

나는 중지를 이용에 NULL 을 찬 0long ago(뿐만 아니라 대부분의 다른 macros).나이지 않고 싶었기 때문에 방지하는 매크로 가능한 한 많은뿐만 아니라,때문에 NULL 가 될 것으로 보인다 사용에서는 C 및 C++코드입니다.그는 데 사용되는 것 같을 때 0 값이 필요한지에 대한 포인터입니다.

새로운 프로젝트에,나는 이 프로젝트에서 헤더:

static const int nullptr = 0;

지금 할 때,C++0x 준수하는 컴파일러에 도착,모든 난해야 할 제거하는 라인입니다.좋은 혜택의 이 Visual Studio 이미 인식하러나 이 주제는 이 라이브러리에는 키워드로와 하이라이트합니다.

난 항상 사용:

  • NULL 에 대한 포인터
  • '\0' 문자에 대 한
  • 0.0 에 대한 수레와 복식

0 잘 할 것입니다.그것은 문제입니다 신호의 의도입니다.는 말했다,나는 항문에 대한니다.

    cerr << sizeof(0) << endl;
    cerr << sizeof(NULL) << endl;
    cerr << sizeof(void*) << endl;

    ============
    On a 64-bit gcc RHEL platform you get:
    4
    8
    8
    ================

똥 묻은 개가 겨 묻은 개를 이야기입니다.를 사용해야 합 NULL 을 처리할 때 포인터입니다.

1)이 선언의 의도(지 검색을 통해 귀하의 모든 코드를 알아내려는 경우는 변수 포인터 또는 일부 숫자 타입)으로 구성되어 있습니다.

2)특정한 API 를 통화를 기대하는 변수는 인수를 사용하여 NULL 포인터 끝을 나타내는 인수의 목록입니다.이 경우에는 사용'0'으로 대신 NULL 문제가 발생할 수 있습니다.에는 64 비트 플랫폼 va_arg 통화를 원하는 64 비트 포인터,아직 당신만 전달 32 비트의 정수입니다.좋은에 의존하고 있는 다른 32-비트 비중을 위해 당신?본 특정 컴파일러(예:인텔의 icpc)없는 그래서 은혜로운--그리고 이 결과 런타임 오류가 있습니다.

면 내가 올바르게 기억에 NULL 을 다르게 정의 헤더에는 내가 사용됩니다.C 로 정의(void*)0 고를 위한 C++그것으로 정의하는 그냥 0.코드 같은 것을 보았다:

#ifndef __cplusplus
#define NULL (void*)0
#else
#define NULL 0
#endif

개인적으로 난 아직도 사용하는 NULL 값을 나타내 null 포인터,그것은 명시적인 사용하고 있는 포인터이 아닌 필수 입력.예 내부적으로는 NULL 값이 0 하지만 그렇지 않으로 표시됩니다.

또한 내가에 의존하지 않는 자동 변환의 정수하는 부울 값을 가지지만 명시적으로 비교할 수 있습니다.

예를 들어 사용하는 것을 선호:

if (pointer_value != NULL || integer_value == 0)

보다:

if (pointer_value || !integer_value)

말 충분하다는 이것은 모두 해결 C++11 할 수 있는 단순히 사용 nullptrNULL, 고,또한 nullptr_t 그것은 유형 nullptr.

내가 말할 것을 역사가 말하는 사람들이 주장에서의 부탁을 사용하 0(zero)잘못했다,(를 포함하여 비얀 표시).이 인수의 부탁에 0 대부분 미학 및"개인정 기본 설정".

후에 창조의 C++11,그러나 이 주제는 이 라이브러리는 새로운 유형,일부 컴파일러를 시작했 불(와 기본 매개 변수)을 통과에 관하여 0 함수 포인터와 인수하기 때문에,0 이 아닌 포인터이다.

만약 코드를 기록했던 사용하여 NULL,간단한 검색 및 교체할 수 있었을 통해 수행됩 codebase 그러나 이 주제는 이 라이브러리 대신 합니다.당신이 붙어로 작성된 코드를 사용하여 선택의 0 으로 포인터를 이것은 훨씬 더 많은 지루한 업데이트합니다.

고 있는 경우를 방지하기 위해 코드는 지금 바로 C++03 표준(고를 사용할 수 없습러나 이 주제는 이 라이브러리),당신은 정말 사용 NULL 입니다.그것은 훨씬 쉽게 당신이 향후 업데이트.

나는 일반적으로 0 을 사용합니다.내가 좋아하지 않는 매크로를 보장할 수는 없습니다 일부 제삼자에 헤더를 사용하지 않는 정 NULL 이 될 뭔가 이상하다.

를 사용할 수 있습러나 이 주제는 이 라이브러리에 객체에 의해 제안된 스캇 메이어 및 다른 사람까지 C++얻러나 이 주제는 이 라이브러리에는 키워드:

const // It is a const object...
class nullptr_t 
{
public:
    template<class T>
    operator T*() const // convertible to any type of null non-member pointer...
    { return 0; }

    template<class C, class T>
    operator T C::*() const   // or any type of null member pointer...
    { return 0; }

private:
    void operator&() const;  // Can't take address of nullptr

} nullptr = {};

Google"러나 이 주제는 이 라이브러리"더 많은 정보를 원하시면.

저는 한 번에 근무하는 기계가 0 이었 유효한 주소와 NULL 었으로 정의 특별한 진수 값입니다.에서는 기계(0!= NULL),그래서 같은 코드

char *p;

...

if (p) { ... }

작동하지 않을 것으로 기대하고 있습니다.당신이 쓰

if (p != NULL) { ... }

하지만 대부분의 컴파일러를 정의 NULL0 으로 이 일로 나는 아직도 기억에서 교훈다:NULL 을 반드시 0.

내 생각에 표준 보장 NULL==0,그렇게 중 하나를 수행할 수 있습니다.내가 선호하는 NULL 기 때문에 그것은 문서 당신의 의도입니다.

를 사용하 0 또는 NULL 동일한 영향을 미칠 것입니다.

그러나,의미하지 않는 것은 그들 모두 좋은 프로그래밍이 실행한다.주어진 것 없는 차이 성능에서 선택,낮은 수준을 알고 있는 옵션을 통해 독립적/추상적인 대체가 나쁜 프로그래밍을 연습한다. 독자 코드의 이해 당신의 생각 과정.

NULL, 0, 0.0, '\0', 0x00 및 whatelse 모든 번역 같은 일이지만,서로 다른 논리적의 엔티티 프로그램입니다.그들은 사용해야 합니다.NULL 포인터입니다,0 양,0x0 은 값의 비트는 흥미로운 etc.지 않을 할당'\0'포인터는지 여부를 컴파일하거나지 않습니다.

나는 알아 일부 지역을 격려하여 깊이 있는 지식의 환경을 파괴하여 환경의 계약입니다.책임 프로그래머,그러나,유지 관리할 수 있는 코드고 이러한 관행이 자신의 코드입니다.

이상한 아무도 포함하여 Stroustroup 언급했다.는 동안 많은 이야기에 대한 표준과 미적 감각도 아무도 눈치는 위험0NULL's 를 대신하여,예를 들어,가변수 목록에서 아키텍처 sizeof(int) != sizeof(void*).다음과 같 Stroustroup,나아보세요 0 에 대한 미학적 이유를 가지고 있지만,하나를 사용하지 않도록 주의 이형도 모호할 수 있습니다.

난을 피하려고 전체적인 질문을 사용하여 C++참조가 가능합니다.보

void foo(const Bar* pBar) { ... }

수도 있습을 종종 할 수 있 쓰

void foo(const Bar& bar) { ... }

물론,이동;하지만 null 포인할 수 있습 과도하게 사용되고 있습니다.

난 이후에 이:-) 때문에 NULL 로의 일부가 아닌 언어,내가 선호하 0 을 사용합니다.

주로 개인의 취향,그래도 하나 만들 수 있는 인자가 NULL 이것은 아주 분명하는 해당 개체가 포인터는 현재 연결하지 않고 아무거나,예를 들어,

void *ptr = &something;
/* lots o' code */
ptr = NULL; // more obvious that it's a pointer and not being used

IIRC,표준을 요구하지 않 NULL0 를 사용하고,어떤에서 정의 <stddef.h> 아마 최고의를 위해 귀하의 컴파일러입니다.

다른 면을 인수해야 하는지 여부를 논리적 사용 비교(암시적으로 캐스팅 bool)또는 명시적으로 확인에 대하여 NULL,하지만 온 가독성 뿐만 아니라.

내가 사용하는 것을 선호하 NULL 으로 명확하게 당신의 의도한 값을 나타내는 포인터지는 산수 값입니다.는 사실 그것은 매크로 불행한 일이지만,이렇게 그렇게 널리 뿌리 깊은 거의 위험(지 않으면 누군가 로키 산맥에서 정말).잘 키워드에서 시작,하지만 당신은 무엇을 할 수 있습니까?

는 말했다,나는 아무 문제가 있으로 포인터를 사용하여 진리로 값습니다.로 NULL,그것은 뿌리 깊은 사용합니다.

C++09 추가할 것입니다 그러나 이 주제는 이 라이브러리 구성하는 생각은 오래전부터이다.

나는 항상 0 을 사용합니다.지에 대한 어떤 진짜 생각하는 이유,그 때문이었을 때 첫 번째 학습 C++기는 사용하는 것이 좋 0 와 나는 항상 그것을 완료하는 방법입니다.에서는 이론이 있을 수 있습 혼란 문제에서 가독성이지만 실제로 나는 결코 한 번에 걸쳐 올 같은 문제에 수천 명의 사람이 시간에 그리고 수백만 라인의 코드입니다.으로 표시 말한다,그것은 정말 개인적인 심미적인 문제 때까지 기준이 되러나 이 주제는 이 라이브러리.

누군가가 나에게 말했다면...I am going to redefine NULL69.이후 나는 그것을 사용하지 않:P

그것은 당신의 코드를 매우 취약합니다.

편집:

하지 않는 모든 표준은 완벽합니다.매크로 NULL 이는 구현 시 정의 C++null 상수 포인터와 완벽하게 호환되지 않습 C NULL 매크로,어떤 외형 숨어있는 암시적으로 변환에 쓸모하는 경향이 오류가 도구입니다.

NULL 지 않는 동작으로 null pointer 지만 O/OL 다.

말해 다음 예에게 혼란을 주지 않는다는 전제하에:

void foo(char *); 
void foo(int); 
foo(NULL); // calls int version instead of pointer version! 

은 모든 것 때문에,새로운 표준에 나타나는 std::nullptr_t

당신이 원하지 않는 경우 기다려야에 대한 새로운 표준을 사용하려러나 이 주제는 이 라이브러리,사용에 적어도 괜찮은 하나같이 제안한 메이어(참조하십시오 존.h 댓글).

잘 나가 주장하지 않 0 을 사용하거나 NULL 이 포인터는 모든 가능 합니다.

를 사용하여 그들이하 세그먼트 오류에 당신의 코드입니다.내 경험에이고 포인터에서 gereral 은 하나의 가장 큰 원인의 버그에서는 C++

또한,그것은"만약 아 null"문은 모든 통해 당신의 코드입니다.훨씬 더 좋은에 의존 수 있습니다 경우 항상 유효한 상태입니다.

거의 항상 더 나은 대안입니다.

설정한 포인터를 포 0 는지는 명확하다.특히 올 경우 이외의 언어는 C++.이 포함되어 있 C 뿐만 아니라 자바 스크립트.

나는 최근에 delt 와 일부 코드는 다음과 같이

virtual void DrawTo(BITMAP *buffer) =0;

순수한 가상의 기능에 대한 첫 시간입니다.나는 생각은 그것을 약간의 마법 jiberjash 니다.깨달았을 때 그냥 기본적으로 설정하는 함수 포인터 null (가상 기능은 함수 포인터에서 대부분의 경우 C++)쫓겨 자신입니다.

virtual void DrawTo(BITMAP *buffer) =null;

되었을 것이 더 적은 혼란상 basterdation 없이 적절한 간격을 나는 새로운 눈입니다.실제로 나는 이유를 궁금 C++지 않는 소문자 사용 null 같은 많은 채 소문자로 거짓과 진실 now.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top