C 언어를 공부하다가 든 궁금증. int main 함수에서 return 0 값이 없어도 에러가 발생하지 않을까?
#include <stdio.h>
int main()
{
int num1, num2, num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
return 0;
}
나는 위와 같은 main 함수를 통해서 변수 num1, num2, num3 에 할당된 숫자들을 printf 함수를 통해 출력하고 싶었다. 나는 int로 main 함수 return 값의 데이터 유형을 지정했으니 0이 리턴되어야 하고 리턴 값이 없으면 에러가 나는 게 맞다고 생각했다.
#include <stdio.h>
int main()
{
int num1, num2, num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
}
10 20 30
하지만 return 0 값이 없어도 에러 메세지는 출력되지 않았다. 오잉 나는 int로 return 값 자료형을 지정했는데 return 값이 없으니 오류가 나야할텐데 이상하다...
return 값이 없으면 main 함수를 void로 선언하면 안되나?? 하고 시도해보니 안된다.
#include <stdio.h>
void main()
{
int num1, num2, num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
}
void main()
^
variable_multiple_decl.c:3:1: note: change return type to 'int'
void main()
^~~~
int
1 warning generated.
10 20 30
return type 을 int로 바꾸라는 에러메세지가 출력된다. main 함수는 무조건 int type으로 선언해야하나보다.
그럼 왜 int type 의 main 함수는 return 값이 없어도 오류가 발생하지 않는걸까?
C 언어의 표준 이전 버전 C99 (ISO/IEC 9899:1999) 에는 이렇게 나와있다. (2011년에 나온 가장 최신 표준 버전인 C11도 C99의 5.1.2.2.3 항목과 내용이 같다.)
5.1.2.2.3 Program termination
1 If the return type of the main function is a type compatible with int, a return from the
initial call to the main function is equivalent to calling the exit function with the value
returned by the main function as its argument;10) reaching the } that terminates the
main function returns a value of 0. If the return type is not compatible with int, the
termination status returned to the host environment is unspecified.
main 함수의 return type이 int와 호환되는 type인 경우, main 함수로의 초기 호출의 반환은 main 함수에 의해 반환되는 값을 인수로 하여 종료함수로 호출하는 것과 같다.
main 함수를 종료하는
}
에 도달하면 값 0이 반환된다. 반환 유형이 int와 호환되지 않으면 host 환경에 반환된 종료 상태가 지정되지 않는다.
이렇게 위의 내용처럼 main 함수를 종료하는 }
에 도달하면 값 0이 자동으로 반환된다는 것이다. 궁금증 해결 !
정리
#include <stdio.h>
int main()
{
int num1, num2, num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
}
C99, C11 표준에 따르면 위처럼 return 값이 필요없는 void type이 아닌 int return 값이 필요한 int type main 함수라도 main 함수를 종료하는 }
에 도달하면 값 0이 반환된다.
#include <stdio.h>
int main()
{
int num1, num2, num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
return "0";
}
warning: incompatible pointer to integer conversion returning 'char [2]' from a function with result type 'int' [-Wint-conversion]
return "0";
^~~
1 warning generated.
하지만 반환 유형이 int와 호환되지 않으면 host 환경에 반환된 종료 상태가 지정되지 않는다. (return 값을 char로 지정하면 위처럼 에러가 발생한다.)
참고
- https://kldp.org/node/161456
- https://stackoverflow.com/questions/493440/why-no-compiler-error-for-main-without-a-return-at-the-end
- ISO/IEC 9899:1999 (5.1.2.2.3)
- ISO/IEC 9899:2011 (5.1.2.2.3)