source

C NULL이 C++11 Nullptr과 같습니까?

factcode 2023. 6. 23. 22:27
반응형

C NULL이 C++11 Nullptr과 같습니까?

나는 사용하기를 좋아합니다.nullptrNULL 대신 입력합니다.이제 C 함수를 호출합니다.libjansson이 경우).

NULLC에서는 구현이 정의되어 있습니다.

위해서nullptr"Null 포인터 상수는 0으로 평가되는 정수 유형의 정수 상수 식(5.19) r 값입니다."

그래서 가장 안전한 방법은:

auto string_obj=json_object_get(m_handle,name);
if(string_obj!=NULL)
    {
    auto string=json_string_value(string_obj);
    if(string!=NULL)
        {return string;}
    }
return nullptr;

정말로 필요한가요? 아니면 더 간단하게 할 수 있나요?

auto string_obj=json_object_get(m_handle,name);
if(string_obj!=nullptr)
    {
    return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr
    }
return nullptr;

C++11 이상에서, 포인터는==NULL또한==nullptr그리고 역도 성립.

용도NULL포인터와 비교하는 것 이외에는 (예를 들어 문자열 끝의 널 바이트를 나타내는 데 사용) 작동하지 않습니다.nullptr.

어떤 경우에는,NULL이라#define NULL 0정수 상수로서0는 포인터와 비교할 때 C 및 C++에 특수하게 적용됩니다.이 유형이 아닌 정보는 C와 C++ 모두에서 일부 문제를 야기하므로 C++에서는 "적절한" 사용 사례에서 동일한 작업을 수행하는 특수 유형과 값을 만들기로 결정했으며 대부분의 "잘못된" 사용 사례에서 안정적으로 컴파일하지 못했습니다.

C++ 구현이 상호 작용 중인 C 구현과 호환되는 한(이것이 사실이 아닌 경우는 매우 드물다) 모든 것이 작동해야 합니다.


아주 분명하게 말하자면, 만약에.ptr는 임의의 종류의 포인터이며, C++에서 다음 식은 동등합니다.

ptr == nullptr
ptr == NULL
ptr == 0
!ptr

다음과 같습니다.

ptr = nullptr
ptr = NULL
ptr = 0

그리고 만약에X는 일부 유형이며, 다음 문장도 마찬가지입니다.

X* ptr = nullptr;
X* ptr = NULL;
X* ptr = 0;

nullptr유형을 추론하는 템플릿 함수에 전달할 때 다릅니다(NULL또는0…이 되다int포인터를 기대하는 인수로 전달되지 않는 한, 동안nullptra로 남음nullptr_t), 그리고 어떤 맥락에서 사용될 때.nullptr컴파일되지 않음(예:char c = NULL;(참고, 아님)char* c=NULL;)

마지막으로, 문자 그대로:

NULL == nullptr

사실입니다.

NULL상수가 포인터 유형으로 승격되고 포인터로서 null 포인터이며, 이는 다음과 동일하게 비교됩니다.nullptr.


이 모든 것에도 불구하고 다음과 같은 것이 항상 사실인 것은 아닙니다.

 foo(NULL)

그리고.

 foo(nullptr)

같은 일을 합니다.

void bar(int) { std::cout << "int\n"; }
void bar(void*) { std::cout << "void*\n"; }
template<class T>
void foo(T t) { bar(t); }
foo(NULL);
foo(nullptr);

이 인쇄물은 을 위해 그리고 을 위해 인쇄됩니다.

언급URL : https://stackoverflow.com/questions/36484473/is-c-null-equal-to-c11-nullptr

반응형