때로는 C 및 C ++ 프로그램에서 NULL
반환 값으로 사용 되는 코더가 표시 main()
됩니다 (예 :
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
이 코드를 gcc로 컴파일하면 다음과 같은 경고 메시지가 나타납니다.
경고 : return은 캐스트없이 포인터에서 정수를 만듭니다 [-Wint-conversion]
이는 매크로 NULL
가 확장되고 (void*) 0
main의 반환 값이 유형 이기 때문에 합리적 int
입니다.
짧은 C ++ 프로그램을 만들 때 :
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
그리고 g ++로 컴파일하면 동등한 경고가 나타납니다.
경고 : NULL이 아닌 포인터가 아닌 유형 ‘int’로 변환 [-Wconversion-null]
그러나 왜 경고를 던질 때의 NULL
반환 값으로 사용 main()
합니까? 코딩 스타일이 좋지 않습니까?
- 경고에도 불구하고 반환 값
NULL
대신에 사용해야하는 이유는 무엇입니까 ?0
main()
- 이것이 적절한 지 아닌지 구현 정의되어 있습니까? 그렇다면 어떤 구현이 포인터 값을 다시 얻고 싶습니까?
답변
어느 것이 합리적입니까
예.
매크로
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-errors
로 NULL
확장되는 구현에서 예상되는 컴파일러 오류가 발생 (void*)0
합니다. 참조 문제 “캐스트없이 포인터에서 정수 / 정수에서 포인터를” .
로 NULL
확장되는 구현에서 0
코드는 엄격하게 표준을 준수하지만 매우 나쁜 스타일, 이식 가능하지 않으며 최악의 경우 : 완전한 넌센스입니다.
그리고 g ++로 컴파일하면 동등한 경고가 나타납니다.
warning: converting to non-pointer type ‘int’ from NULL [-Wconversion-null]
C ++ 11 이상에서는 NULL
사용하지 말고 대신 사용하십시오 nullptr
. main ()에서 반환하는 것은 관계없이 올바르지 않습니다. NULL
항상 0
C ++로 확장 되므로 엄격하게 말하면 작동하지만 스타일이 나쁘고 최악입니다. 완전한 말도 안됩니다.
코딩 스타일이 좋지 않습니까?
나쁘지 않고 근거없는 코딩 스타일. 그것을 쓴 프로그래머는 무능했다.
답변
코딩 스타일이 좋지 않습니까?
보다 나쁜. 프로그램이 정상적으로 완료되었음을 나타내는 올바른 방법은
#include <stdlib.h>
int main (void)
{
return EXIT_SUCCESS;
}
답변
어떤 / 많은 / 모든? C ++ 구현 NULL
은로 확장 된 매크로 0
입니다.
실제로 확장하면이 결과가 나타납니다 return 0
. 유효한 반환 값입니다.
코딩 스타일이 좋지 않습니까?
예.