왜 main ()에서 NULL을 반환합니까?


10

때로는 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()
  • 이것이 적절한 지 아닌지 구현 정의되어 있습니까? 그렇다면 어떤 구현이 포인터 값을 다시 얻고 싶습니까?

4
직접 문의해야합니다.
juanchopanza

5
"main ()의 반환 값으로 NULL을 사용하는 이유"-우리는 그렇지 않습니다. 해당 코드의 작성자가 수행합니다. 나는 듣고 싶네 이유를 정당화에 시도.
WhozCraig

1
모스크바에서 @ 블라드 예하지만 실제로 0인지 확인해야했습니다. ^^- EXIT_FAILURE8이며 1을 사용하면 일부 프로그램에서 성공으로 사용되기 때문에 실패에 좋지 않은 것 같습니다.
Waelmio

2
@RobertSsupportsMonicaCellio 그것이 실제로 당신이 얻은 응답이라면, 그것은 슬픈 일입니다. 첫째, 그것은 말이되지 않습니다 ( 어딘가 보다 어디에나 있다면 더 이해가됩니다 ). 둘째, 매진입니다. 코드를 작성하는 경우 코드가 올바른지에 대한 좋은 나침반이 있어야합니다. 그것이 누군가와 함께하는 것처럼 보이기 때문입니다. 바늘이 올바른 방향을 가리키고있는 것 같습니다 (따라서 물어 보는 이유). 그 코드를 작성한 사람이 아니라 그 이유에 대한 답을 먹이십시오.
WhozCraig

2
c에서는 NULL포인터를 0(로 캐스팅하지 않고) 정의하는 것이 유효합니다 void *. 이 경우, 결함은 눈에 띄지 않게되고 경고를 생성하지 않습니다. 여전히 NULL을 사용해야하는 것은 아닙니다.
Ctx

답변:


14

어느 것이 합리적입니까

예.

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

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

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

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

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

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

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


1
내 평소 쿵쿵 거리는 소리 : 컴파일러가 허용하는지 여부는 구현에 의해 정의 되지 않습니다 . 그것은이다 된 구현에 특정 . 표준에서 "구현 정의"는 구현이 수행하는 작업을 문서화해야 함을 의미합니다.
피트 베커

@PeteBecker 나는 그것을 쓸 때 멈췄지만 어쨌든 앞서 나갔다. 그러나 당신은 맞습니다, 나는 그것을 바꿀 것입니다.
Konrad Rudolph

"구현 정의"가 자연스럽게 들리는 유일한 이유는 사람들이 그것을 잘못 사용하는 데 익숙해 져 있기 때문입니다. <g>
피트 베커

8

이 코드를 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 ++로 확장 되므로 엄격하게 말하면 작동하지만 스타일이 나쁘고 최악입니다. 완전한 말도 안됩니다.

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

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


2

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

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

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}

1
순수한 pedantry입니다. C 표준에 따르면 0 인수 exit()(또는 main에서 0 반환 값)는와 동일 함을 의미합니다 EXIT_SUCCESS.
mosvy

그리고 c99 이후부터는 returnfrom을 생략 할 수 있습니다 main. 따라서 프로그램의보다 "올바른"버전은 int main(void){};-)
mosvy

1

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

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

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

예.

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