[c++] 왜 main ()에서 NULL을 반환합니까?

때로는 C 및 C ++ 프로그램에서 NULL반환 값으로 사용 되는 코더가 표시 main()됩니다 (예 :

#include <stdio.h>

int main()
{
    printf("HelloWorld!");

    return NULL;
} 

이 코드를 gcc로 컴파일하면 다음과 같은 경고 메시지가 나타납니다.

경고 : return은 캐스트없이 포인터에서 정수를 만듭니다 [-Wint-conversion]

이는 매크로 NULL가 확장되고 (void*) 0main의 반환 값이 유형 이기 때문에 합리적 int입니다.

짧은 C ++ 프로그램을 만들 때 :

#include <iostream>
using namespace std;

int main()
{
    cout << "HelloWorld!";

    return NULL;
}

그리고 g ++로 컴파일하면 동등한 경고가 나타납니다.

경고 : NULL이 아닌 포인터가 아닌 유형 ‘int’로 변환 [-Wconversion-null]

그러나 왜 경고를 던질 때의 NULL반환 값으로 사용 main()합니까? 코딩 스타일이 좋지 않습니까?


  • 경고에도 불구하고 반환 값 NULL대신에 사용해야하는 이유는 무엇입니까 ?0main()
  • 이것이 적절한 지 아닌지 구현 정의되어 있습니까? 그렇다면 어떤 구현이 포인터 값을 다시 얻고 싶습니까?


답변

어느 것이 합리적입니까

예.

매크로 NULL가 확장 되기 때문에(void*) 0

아니요. C ++에서 매크로 NULL 확장 되지 않아야 합니다.(void*) 0 [support.types.nullptr]로 . C에서만 가능합니다.

어느 쪽이든, 구현 방법에 관계없이 null 포인터 상수NULL 를 참조해야하기 때문에 이와 같은 코드를 작성하는 것은 잘못된 것입니다. 대신에 사용하는 것은 논리적 오류입니다.int

  • 경고에도 불구하고 NULL반환 값으로 0 대신에 사용해야하는 이유는 무엇입니까 main()?

무지. 더 없다 좋은의 이 작업을 수행하는 이유는.

  • 이것이 적절한 지 아닌지 구현 정의되어 있습니까? 그렇다면 어떤 구현이 포인터 값을 다시 얻고 싶습니까?

아니요, 절대 적절 하지 않습니다 . 컴파일러가 허용 하는지 여부는 구현에 달려 있습니다 . 적합한 C ++ 컴파일러는 경고없이 허용 할 수 있습니다.


답변

이 코드를 gcc로 컴파일하면 다음과 같은 경고 메시지가 나타납니다.

warning: return makes integer from pointer without a cast

lax 컴파일러 옵션으로 컴파일하기 때문입니다. 엄격한 C 표준 설정 을 사용하면 null 포인터 상수 -std=c11 -pedantic-errorsNULL확장되는 구현에서 예상되는 컴파일러 오류가 발생 (void*)0합니다. 참조 문제 “캐스트없이 포인터에서 정수 / 정수에서 포인터를” .

NULL확장되는 구현에서 0코드는 엄격하게 표준을 준수하지만 매우 나쁜 스타일, 이식 가능하지 않으며 최악의 경우 : 완전한 넌센스입니다.

그리고 g ++로 컴파일하면 동등한 경고가 나타납니다.

warning: converting to non-pointer type int from NULL [-Wconversion-null]

C ++ 11 이상에서는 NULL사용하지 말고 대신 사용하십시오 nullptr. main ()에서 반환하는 것은 관계없이 올바르지 않습니다. NULL항상 0C ++로 확장 되므로 엄격하게 말하면 작동하지만 스타일이 나쁘고 최악입니다. 완전한 말도 안됩니다.

코딩 스타일이 좋지 않습니까?

나쁘지 않고 근거없는 코딩 스타일. 그것을 쓴 프로그래머는 무능했다.


답변

코딩 스타일이 좋지 않습니까?

보다 나쁜. 프로그램이 정상적으로 완료되었음을 나타내는 올바른 방법은

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}


답변

어떤 / 많은 / 모든? C ++ 구현 NULL은로 확장 된 매크로 0입니다.

실제로 확장하면이 결과가 나타납니다 return 0. 유효한 반환 값입니다.

코딩 스타일이 좋지 않습니까?

예.


답변