int main() int main(void) / void main() / main()
메인함수 형태별 차이점
int main()은 여러 매개 변수를 사용하여 호출할 수 있다.
int main(void)는 매개변수 없이만 호출이 가능하다. C에서 권장.
함수 정의 앞에 붙는 데이터형은 함수의 리턴값의 데이터형입니다.
int main() 하면 main() 함수가 종료할때 정수형 값을 리턴하겠다는 뜻이고,
void main() 하면 main() 함수가 종료할때 아무 값도 리턴하지 않겠다는 뜻이며,
main() 하면 void main() 과 같습니다.
main() 함수는 프로그램의 엔트리포인트로서, 운영체제가 실행시켜주는 함수입니다.
따라서 main() 함수의 리턴값은 운영체제가 받아보게되죠.
운영체제는 프로그램이 종료할때 main() 함수의 리턴값을 받아보고 프로그램이 왜 종료되었는가를 판단합니다.
보통의 경우, main() 함수가 0 을 리턴하면 프로그램이 정상적으로 실행을 마치고 종료한것으로 간주하고,
0 이외의 값을 리턴할 경우 비정상적으로 종료된것으로 간주합니다.
그러나, 운영체제가 프로그램의 종료사유를 아는것이 사용자 입장에서는 아무 의미가 없는 동작입니다. 그래서 결론적으로, main() 함수가 어떤 값을 리턴하는지는 운영체제에게만 중요할 뿐, 사용자에게는 전혀 중요하지 않습니다.
그러니, int main() 든 void main() 이든 main() 이든 사용자 입장에서는 아무 차이점이 없고, 다만 운영체제의 입장에서는 약간의 의미가 있을수는 있습니다.
참고로, C언어 표준이 제시하는 가장 이상적인 main() 함수의 정의문은 이렇습니다.
int main( int argc, char *argv[], char *env[] )
argc : 배열 argv[]의 크기 (커맨드라인 인수의 개수 +1)
argv[]는 포인터 배열로 되어 있습니다 (예 : test.exe val1 val2 val3)
argv[0] : 프로그램 파일의 경로와 파일명의 문자열을 가리키는 포인터
argv[1] : 첫 번째 커맨드라인 인수의 문자열을 가리키는 포인터
argv[2] : 두 번째 커맨드라인 인수의 문자열을 가리키는 포인터
콘솔프로그램에서 프로그램을 실행시킬 때 관리자모드로 실행시킨다던가,
파일이나 폴더를 만드는데 readonly 권한으로 만들기 등등으로 이해함
예제
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
int i;
if (argc <= 1) { // 인수를 지정 안했을 때
printf("11");
return; // 오류방지
}
if (strcmp(argv[1], "enum") == 0) { //문자열 비교(길이와 함께)
for (i = 0; i < argc; i++) {
printf("argv[%d] : %s\n", i, argv[i]);
}
}
else if (strcmp(argv[1], "count") == 0) {
printf("커맨드라인 인수의 개수 : %d\n", argc-1);
}
}
참고1 : https://www.hackerschool.org/
참고2 : 알고리즘이 보이는 그림책
엔트리포인트 (entry point)
엔트리 포인트는 제어가 운영체제에서 프로그램으로 이동하는 것.
프로세서는 프로그램이나 코드에 진입해 실행을 시작한다
프로그램 실행은 main함수에서 시작된다.
그래서 엔트리 포인트는 main 함수라고 불린다.
'C, C++' 카테고리의 다른 글
c 난수 생성 함수 (0) | 2021.09.08 |
---|---|
보안 경고 #define _CRT_SECURE_NO_WARNINGS (0) | 2021.09.08 |
strcmp, strncmp - 두 문자열 일치 비교, 길이 특정 (0) | 2021.09.08 |
[c] 파일포인터와 fopen, fclose, fprintf, fgets (0) | 2021.08.30 |
[C] strcpy, strncpy (0) | 2021.08.27 |