C && C++

[C/C++] main 함수

힘법사 2022. 1. 25. 17:24
728x90

서론

 안녕하세요, 오늘은 C/C++ 로 프로그램을 할 때 제일 처음 만나게 되는 main 함수에 대한 주제를 정리해보겠습니다.

저도 사실은 main 함수에 대해서는 그 전에는 단지 코드 상에서 실행시키게 되면 제일 처음 실행하는 함수 이정로 알고 있었고 깊게는 나아가지 않았습니다.

 예전에 배치 파일을 사용하면서 main 함수에 대해서 공부해야겠다.. 생각만 하고 까먹고 넘어갔었는데 오랜만에 생각나서 이렇게 공부해서 정리하게 되었습니다. 자료는 IBM Docs 자료를 참고하였습니다.

IBM Docs - IBM Documentation

 

main 함수의 실행

 프로그램이 실행될 때 시스템은 main 함수를 호출하게 됩니다. 이처럼 우리는 프로그래밍을 하면서 코드에서 main 함수가 제일 먼저 실행된다는 것을 아시고 계셨을겁니다. 이 우리가 자주 만나는 main 함수에도 규칙이 있습니다.

 

main 함수의 규칙

1. main 함수는 프로그램에 하나 존재해야한다.

main 함수는 프로그램에 하나 존재해야합니다. main 함수가 없거나 main 함수가 두개 이상이면 안됩니다.

#include <stdio.h>

int main(void) {
	printf("Hello World!");

	return 0;
}

해당 코드는 main 함수가 하나로 실행이 잘 이뤄집니다.

 

#include <stdio.h>

int main(void) {
	printf("Hello World!");

	return 0;
}

int main(void) {
	printf("Hello World!");

	return 0;
}

 반면 해당 코드처럼 main 함수가 두개 이상인 경우  error C2084: 'int main(void)' 함수에 이미 본문이 있습니다. 해당 메세지와 함께 컴파일 에러를 일으킵니다.

#include <stdio.h>

int print(void) {
	printf("Hello World!");
	return 0;
}

 마찬가지로 main 함수가 하나도 없을 경우에도 프로그램이 컴파일 에러를 일으킵니다.

 

2. 프로그램에는 main 함수라 불리는 다른 함수가 존재해서는 안된다.

1번 사례에서 볼 수 있듯이 main 함수라 불리는 다른 함수가 존재할 경우 컴파일 자체가 진행되지 않겠지요?

 

3. main 함수는 inline static으로 정의되어서는 안된다.

 우리가 함수를 짤 때 함수를 inline으로 또는 static으로 짤 수 있습니다. main함수에는 불가능하다는 내용입니다.

 

++

여기까지 C와 C++에 공통되는 main 함수의 규칙이었습니다.

 

C++에서는 다른 제약이 추가로 존재합니다.

 

4.  main은 프로그램 안에서 호출될 수 없다.

저는 주로 C++을 사용해왔기 때문에 main을 당연히 재귀함수 마냥 사용하면 안될 것이라고 막연히 생각해왔습니다. 하지만, C에서는 이런 방식이 가능합니다

#include <stdio.h>

int val = 0;

int main(void) {
	if (val == 5) return 0;
	printf("Hello World!\n");
	val++;
	return main();
}

보시면 main 함수 안에서 main을 호출하고 있습니다. main 함수가 자기 자신을 호출하는 코드입니다. 컴파일을 해보면 C에서는 컴파일도 정상적으로 수행되고, 실행도 정상적으로 동작됩니다.

C에서 main 함수가 main 함수를 호출한 결과

※ C++에서 main 함수를 호출하면 오류나는 것을 보여드려 했는데... 제 비주얼 스튜디오 2019 컴파일러가 그냥 컴파일 시켜버리네요... 이 부분은 해당 링크를 보시면 될 것 같습니다.

728x90

Can main function call itself in C++? - Stack Overflow

 

Can main function call itself in C++?

Can anybody tell what's the problem of the code below? int main () { return main(); } I tested, it compiles correctly. It's running forever. Anymore trick behind the scene?

stackoverflow.com

 

5. main 함수의 주소를 취할 수 없다.

6. main 함수는 오버로딩 될 수 없다.

 

argc, argv 파라미터

main 함수는 다음과 같은 형태로 보통 작성됩니다.

// case 1
int main(){
	return 0;
}

// case 2
int main(void){
	return 0;
}

//case 3
int main(int argc char *argv[]){
	return 0;
}

//case 4
int main(int argc, char ** argv){
	return 0;
}

기본적으로 case 1 / 2 와 case 3 / 4는 같은 동작을 보여줍니다.

 

 case 1과 case 2는 많이 사용는 이유로 많은 분들이 익숙하실 겁니다. 하지만, case 3와 case 4는 아직 만나보시지 못한 분들도 계실 것 같습니다. case 3와 case 4는 main 함수에서 입력 파라미터들을 받도록 조치한 형태입니다. 보시면 int argc라는 integer형 변수를 하나 char 포인터의 배열을 나타내는 argv를 받는 것을 보실 수 있습니다.

 

 argc는 argument count를 의미하고, argv는 argument vector를 의미합니다. 즉. argc는 argv의 크기를 나타내고 argv는 간단하게 스트링들의 배열로 생각하시면 됩니다.

 

 case 3와 case 4처럼 프로그래밍을 할 경우 main 함수에서 입력 파라미터를 받을 수 있게 됩니다. 

 제가 예시를 하나 보여드리겠습니다.

 아래 코드는 main 함수에서 입력 받은 char 포인터의 배열을 출력하도록 만든 코드입니다.

#include <stdio.h>

int main(int argc, char *argv[]) {
	int i;
	for (i = 0; i < argc; i++) {
		printf("%d.%s\n", i, *(argv + i));
	}
	return 0;
}

해당 코드를 컴파일하게 되면 exe 파일을 하나 얻을 수 있습니다.

 

명령 프롬프트를 켜서 해당 exe 파일이 있는 디렉토리를 써주고 그 뒤에 원하는 글들을 써주면 작동됩니다.

예를 들어서 제가 생성상 exe 파일이 C:\Users\ys006\source\repos\main\x64\Release에 존재한다고 했을 때

C:\Users\ys006\source\repos\main\x64\Release\main.exe Hello World Happy day와 같이 프롬프트에 써주게 되면 아래와 같은 결과를 얻게 됩니다.

사용자의 입력 수만큼 argc에 입력이 되었고 입력한 내용들은 모두 argv에 잘 담긴 것을 확인하실 수 있습니다.

추가적으로 반드시 변수들의 이름이 argc, argv가 아니어도 돌아갑니다.

 

제가 임의로 코드를 아래와 같이 작성하여 실행시켜 보면 파라미터 이름이 argc, argv가 아니지만 잘 동작합니다.

#include <stdio.h>

int main(int argument_count, char** argument_vector) {
	int i;
	for (i = 0; i < argument_count; i++) {
		printf("%d.%s\n", i + 1, argument_vector[i]);
	}
	getchar();
	return 0;
}

넵 오늘은 main 함수에 대해서 여러가지를 알아보았습니다. 다음에도 좋은 내용 쓸 수 있도록 하겠습니다 감사합니다!

728x90