programing

C/C++에서 NULL 포인터를 확인하는 중입니다.

newsource 2022. 8. 12. 23:28

C/C++에서 NULL 포인터를 확인하는 중입니다.

에서는, 가 모든 것을 .NULL같이 .

int * some_ptr;
// ...
if (some_ptr == NULL)
{
    // Handle null-pointer error
}
else
{
    // Proceed
}

대신

int * some_ptr;
// ...
if (some_ptr)
{
    // Proceed
}
else
{
    // Handle null-pointer error
}

NULL이 해 주세요」라고 하는 더 만, 이 있는 「NULL」이라고 하는 하는 것을 할 수 있다고 으로, . 것을 이해할 것이라고 말함으로써 그것에 대항할 것이다.if하고 .NULL또한 두 번째 방법은 같은 버그를 도입할 가능성이 적다고 생각합니다.

if (some_ptr = NULL)

찾아내고 디버깅하는 게 너무 귀찮아요.

어떤 방식을 선호하고 그 이유는 무엇입니까?

내 경험상, 형태 테스트는if (ptr) ★★★★★★★★★★★★★★★★★」if (!ptr)기호.NULL우발적인 할당의 기회는 노출되지 않습니다.그리고 그들은 명확하고 간결하다.

편집: SoapBox가 댓글로 지적한 바와 같이 다음과 같은 C++ 클래스와 호환됩니다.auto_ptr이며, 인 that that that that, that that that that that that that that that that로 합니다.bool이 관용구를 사용할 수 있도록 합니다.오브젝트에 는, 「」에의 인 비교입니다.NULL해야 하며, 로의 변환은 다른 한 존재 확인보다 이 더 . 포인터로의 변환은 다른 의미적 부작용을 가질 수도 있고, 또는 단순한 존재 확인보다 더 비쌀 수도 있습니다.bool변환은 암시합니다.

나는 불필요한 텍스트 없이 그것이 무엇을 의미하는지 알려주는 코드를 선호한다. if (ptr != NULL) if (ptr)하지만 중복된 특수성을 희생해야 합니다.은 '하다'라고 쓰면 .if ((ptr != NULL) == TRUE)C언어에 의해 테스트C언어합니다.if,while0은 참, 0은 거짓입니다.용장성이 있다고 해서 명확해지는 것은 아닙니다.

이것부터 시작합시다.일관성이 가장 중요합니다.결정은 코드 베이스의 일관성보다 덜 중요합니다.

C++의 경우

은 NULL로 됩니다.0 ★★★★★★★★★★★★★★★★★」0LC++라고 하다.

C++ 프로그래밍 언어 Bjarne Strustrup이 과제를 매크로를 사용하지 않기 위해 명시적으로 사용하는 것을 제안하고 있다면, 그가 비교해서 같은 것을 했는지 잘 모르겠다.책을 읽은 지 꽤 지났지만, 그는 그냥 한 것 같다.if(some_ptr)명확한 비교는 없지만 나는 그것에 대해 애매하다.

는 " " " " "''로 있기 입니다.NULL이다.0이름에서 알 수 있듯이 고유한 유형이 아닌 리터럴입니다.매크로의 회피는 C++의 일반적인 가이드라인 중 하나입니다. 반,는0정수처럼 보이지만 포인터와 비교하거나 포인터에 할당하는 경우에는 그렇지 않습니다.개인적으로는 어느 쪽으로든 갈 수 있지만, 보통은 명시적인 비교는 생략합니다(일부 사람들은 이것을 싫어하지만, 어쨌든 변화를 제안하는 기고가 있을 것입니다).

개인적인 감정에 상관없이 이것은 하나의 올바른 방법이 없기 때문에 대체로 가장 덜 나쁜 선택이다.

이것은 명확하고 일반적인 관용어이며, 저는 그것을 선호합니다.비교 중에 실수로 값을 할당할 가능성은 없고, 또 명확하게 읽혀져 있습니다.

if (some_ptr) {}

만약 당신이 그것을 안다면 이것은 분명하다.some_ptr는 포인터 타입이지만 정수 비교처럼 보일 수도 있습니다.

if (some_ptr != 0) {}

이건 분명해, 일반적인 경우엔 말이 돼...하지만 그건 새어나오는 추상화에요NULL사실0문자 그대로 오용될 수 있습니다.

if (some_ptr != NULL) {}

C++11에는nullptr이 방법은 명확하고 정확하기 때문에 현재 선호되는 방법입니다.우발적인 할당에 주의해 주십시오.

if (some_ptr != nullptr) {}

C++0x로 이행할 수 있을 때까지 이러한 방법을 사용하는 것은 시간 낭비라고 생각합니다.이러한 방법들은 모두 불충분하기 때문에 nullptr이 발명되었습니다(완벽한 전송을 실현하는 일반적인 프로그래밍 문제와 함께).가장 중요한 것은 일관성을 유지하는 것입니다.

주식회사

C는 다른 짐승이다.

주식회사NULL라고 정의할 수 있다0또는 로서((void *)0), C99 에서는, 실장 정의의 늘 포인터 상수를 사용할 수 있습니다.결국 구현의 정의로 귀결됩니다.NULL표준 라이브러리에서 검사해야 합니다.

매크로는 매우 일반적이며 일반적으로 언어 및 기타 일반 프로그래밍 지원의 결함을 보완하기 위해 많이 사용됩니다.언어는 훨씬 단순하고 프리프로세서에 의존하는 것이 일반적입니다.

이러한 관점에서 볼 때, 저는 아마도 다음 웹 사이트를NULL매크로 정의(C)

if (foo)충분히 명확합니다.쓰세요.

C 프로그래밍 언어(K&R)에서는 실수로 인한 할당을 방지하기 위해 null == ptr을 확인해야 합니다.

딱 한 가지만 더 찬성이야foo == NULL연습:한다면foo예를 들어,int *또는bool *, 그 다음에if (foo)수표는 실수로 독자에 의해 포인트의 가치를 테스트하는 것으로 해석될 수 있다.if (*foo).그NULL비교는 포인터에 대해 말하고 있다는 것을 상기시켜 줍니다.

하지만 좋은 명명 규칙은 이 주장을 설득할 수 없을 것 같다.

개인적으로 저는 항상if (ptr == NULL)내 의도를 분명히 알 수 있지만 이 시점에서는 그냥 습관일 뿐이야

사용.=대신해서==어떤 유능한 컴파일러에 의해 정확한 경고 설정으로 잡힐 것이다.

중요한 점 당신의 그룹을 위해고 이를 지켜 일관된 스타일을 선출해야 한다.당신이 어느 길로 가는가, 결국 그걸 못 깨달았는데, 마찰의 다른 사람들의 코드에서 일하는 것은 손실을 많이 익숙해질 것입니다.

이것은 포인터 컨트롤 표현으로 사용할 수 있는 형식과 값에 평가 두 언어의 기본.boolC++및에intC에서 그냥 그것을 사용하세요.

문제가 일어난 이유 솔직히, 나는 보지 않는다.어느 쪽이든 꽤 하고, 누군가 적당히 C또는 C++으로 경험했던 둘 다 이해해야 한다 분명하다.어느 말 있는데,'

만약 당신이 오류를 인식하고 기능(즉,하 즉시 예외 오류 코드의 열 꺼다)실행을 계속할 계획인데, 당신은 가드 조항: 만들어야 한다.

int f(void* p)
{
    if (!p) { return -1; }

    // p is not null
    return 0;
}

이렇게 하면,"화살표 코드입니다."을 피한다.

  • Pointers지 않는다 booleans
  • 쓸 때는 근대 C/C++ 컴파일러에서는 경고를 내뿜습니다.if (foo = bar)사고였어.

따라서 나는 선호한다

if (foo == NULL)
{
    // null case
}
else
{
    // non null case
}

또는

if (foo != NULL)
{
    // non null case
}
else
{
    // null case
}

만약 내가 이렇게 놓지 않을 것 스타일 지침을 쓰고 있었습니다. 그러나, 내가: 같은 것들을 넣을 것이다.

포인터에 대해 null 검사를 수행했는지 확인하십시오.

사용하고 있다if (ptr)하지만 이것은 전혀 논쟁할 가치가 없다.

나는 내 방식이 간결해서 마음에 든다, 하지만 다른 사람들은 말한다.== NULL읽기 쉽고 알기 쉽게 만듭니다.그들이 어디서 왔는지 알겠네요. 단지 다른 것들이 더 쉽게 만들어 주는 것에 동의하지 않을 뿐이에요.(매크로가 싫어서 편견이 있어요)너한테 달렸어.

저는 당신의 주장에 동의하지 않습니다.조건부 할당에 대한 경고가 표시되지 않으면 경고 수준을 높여야 합니다.그렇게 간단해. (그리고 좋은 모든 것을 위해, 그들을 바꾸지 마.)

C++0x에서는 다음과 같이 할 수 있습니다.if (ptr == nullptr)그게 더 잘 읽히긴 하죠. (다시 말하지만, 난 매크로가 싫어.그렇지만nullptr좋습니다.)난 여전히 한다.if (ptr)하지만, 내가 익숙한 일이기 때문에.

저는 C/C++가 부울 조건의 타입을 체크하지 않는 것을 매우 좋아합니다.if,for그리고.while진술들.항상 다음을 사용합니다.

if (ptr)

if (!ptr)

Bool로 변환되는 정수 또는 기타 유형에서도 다음과 같이 처리됩니다.

while(i--)
{
    // Something to do i times
}

while(cin >> a >> b)
{
    // Do something while you've input
}

이 스타일로 코딩하는 것이 더 읽기 쉽고 명확합니다.제 개인적인 생각일 뿐이에요.

최근 OKI 431 마이크로컨트롤러에서 작업하는 동안 다음과 같은 사실을 알게 되었습니다.

unsigned char chx;

if (chx) // ...

보다 효율적입니다.

if (chx == 1) // ...

왜냐하면 나중에 컴파일러가 chx의 값을 1과 비교해야 하기 때문입니다.여기서 chx는 true/false 플래그일 뿐입니다.

사실 저는 두 가지 종류를 모두 사용합니다.

포인터의 유효성을 먼저 확인하고 NULL일 경우 함수를 반환/종료하는 경우가 있습니다.(이것에 의해, 「기능에 출구점이 1개 밖에 없는 경우」라고 하는 논의가 생기는 것을 알고 있습니다).

대부분의 경우 포인터를 확인하고 원하는 작업을 수행한 후 오류 사례를 해결합니다.그 결과 if가 여러 개 있는 보기 흉한 x배 들여쓰기 코드가 될 수 있습니다.

스타일과 형식을 리뷰에 포함시키려면 비교 검토에 대한 합의된 스타일 가이드가 있어야 합니다.있으면 스타일 가이드에 있는 대로 하세요.없는 경우, 이런 내용은 그대로 남겨야 합니다.이는 시간과 에너지를 낭비하는 것이며, 코드 리뷰가 실제로 밝혀내야 하는 것을 방해합니다.정말이지 스타일 가이드가 없다면, 내가 선호하는 규약을 사용하지 않더라도 원칙적으로 코드를 변경하지 않도록 할 것입니다.

그게 중요한 건 아니지만 제 개인적인 취향은if (ptr)그 의미는 내게는 심지어 그 의미보다 더 명백하다.if (ptr == NULL).

행복의 길을 가기 전에 에러 상태를 처리하는 게 낫다고 말하려는 건 아닐까요?그 경우에도 저는 리뷰어의 의견에 동의하지 않습니다.저는 이것에 대해 받아들여지는 관행이 있는지는 모르지만, 제 의견으로는 가장 "정상적인" 조건이 어떤 if 진술에서도 우선되어야 한다고 생각합니다.이렇게 하면 함수가 무엇이고 어떻게 작동하는지 알기 위해 더 이상 파고들 필요가 없습니다.

예외는 오류로 인해 함수에서 벗어나거나 계속하기 전에 함수에서 복구할 수 있는 경우입니다.이 경우 먼저 오류를 처리합니다.

if (error_condition)
  bail_or_fix();
  return if not fixed;

// If I'm still here, I'm on the happy path

이상 상황에 미리 대처하는 것으로, 대처하고 나서 잊어버릴 수 있습니다.하지만 내가 먼저 처리해서 행복한 길로 돌아갈 수 없다면, 그것은 코드를 더 이해하기 쉽게 하기 때문에 본건 이후에 처리되어야 한다.제 생각에는.

하지만 스타일 가이드에 나와 있지 않다면 제 의견일 뿐이고, 당신의 의견도 타당합니다.표준화하든 안하든 둘 중 하나다.리뷰어가 의견을 가지고 있다고 해서 사이비 평준화 시키지 마세요.

제가 사용한 컴파일러의 대부분은 적어도if더 이상 구문설탕을 사용하지 않는 과제요, 그래서 그런 주장은 믿지 않아요.그렇다고는 해도, 저는 둘 다 프로페셔널하게 사용해 본 적이 있기 때문에, 어느 쪽도 선호하지 않습니다.== NULL제 생각에는 확실히 더 명확합니다.

언급URL : https://stackoverflow.com/questions/3825668/checking-for-null-pointer-in-c-c