인프런 커뮤니티 질문&답변

쏭쌤님의 프로필 이미지
쏭쌤

작성한 질문수

홍정모의 따라하며 배우는 C언어

2.6 printf() 함수의 기본적인 사용법

메인함수 질문입니다.

해결된 질문

작성

·

1.8K

2

이런식으로 한 프로젝트 안에 두 개의 소스파일을 작성하고 각 소스파일 내부에서 각각 메인함수를 작성했을 때, 소스파일을 컴파일하려 하면 이런 에러가 뜹니다. 혹시 이런 경우에는 다른 소스파일에 있는 메인함수 이름을 바꿔서 실행시키는 방법 말고는 해결 방법이 없을까요?

답변 3

5

아주 큰 프로그램의 경우 하나의 소스코드로 해놓으면 한줄을 고치게 될 경우에도 전체를 컴파일 해야합니다.
때문에 여러 파일로 나누고 바뀐 부분만 컴파일하여 이런저런 낭비를 줄일 수 있게합니다.

저도 같은 문제에 직면 했는데 그럼 프로젝트를 따로 만들지 않고 해결하는 방법 중에는 컴파일 해보고자 하는 소스코드파일 외의 main 함수들을 작동되지 않게끔 다른 이름으로 바꾸어놓는 방법 밖에 없을까요 ㅠㅠ?

그렇습니다.

먼저는 다음과 같은 질문을 스스로에게 던져보세요. main 함수는 뭐하는 녀석일까? 스스로 설명하실 수 있다면 바로 안된다. 라는 걸 알게 되실 겁니다.

A와 B 소스 코드를 하나의 프로젝트 안에 두겠다. 는 것은
하나의 프로그램을 만드는 데에 A와 B 모두를 사용하겠다. 라는 것인데요.

A 소스 코드 내에도 main이 있고, B 소스 코드 내에도 main이 있으면
프로그램은 어디에서 시작해야할까? 를 결정하지 못합니다. (Charlie park님의 답변 Entry point 어쩌구 이야기입니다.)
때문에 따로 만들어서 하셔야 됩니다.

Charlie Park님의  답변 두 번째 이유도 조금 다시 보시면 좀 더 좋을 것 같습니다. 감사합니다.


조금 덧붙이면

목적이 무엇인지는 모르겠으나,
공부하는 데에 새로운 프로젝트를 만드는 게 좀 귀찮다. 라는 것이면 다음 방법을 사용해볼 수 도 있겠습니다. (지금 생각해보니 저는 꽤 귀찮은 일이었던 것 같네요.)

(i) 먼저 main 함수를 만듭니다.
이 main 함수는 챕터 전체를 아우르는 메인함수입니다.

(ii) 각 챕터의 작은 내용마다 
main_1_1() 
main_1_2()
....

함수를 담고있는 소스 코드를 만듭니다.

(iii) 실제 main 함수 내에서는 다음과 같이 실행합니다.

int main()
{
    main_1_1();
    main_1_2();
}

1_1의 결과만 보고 싶은 경우라면 1_2는 주석 처리하면 되겠지요?
이 방법은 아마 다른 프로그램을 만드는 데에도 응용하실 수 있을 겁니다.

음..주석은 바로 다음 강의인 2.7 강의에서 설명하네요.
얼른 다음 강의도 보세요~

친절한 답변 감사합니다. 근데 궁금증이 생겼는데 예를 들어 한 프로젝트 내에서 first.c 와 second.c라는 소스파일이 있고 first.c에는 main함수와 fn1이라는 함수가, second.c에는 fn2가 있대고 할 때 프로젝트를 실행시키면 함수 실행 우선순위는 어떻게 되나요?

좋은 궁금증이군요.
정말 좋은 방법을 하나 알려드리겠습니다.

스스로 실험을 해보실 수 있어요.
둘의 위치를 바꾸어가며 어떻게 되는걸까? 한 번 느껴보세요.
검증하려면 어떻게 해야하는걸까? 고민해보세요.
저는 진심으로 이것이 가장 좋은 방법이라고 생각합니다.

visual studio 를 사용중이시면 f11 키를 눌러보시는 것도 좋겠네요.

5

넵. 한 프로젝트에는 하나의 main() 함수만 존재할 수 있습니다.

두 가지 이유가 있는데요, 첫째는 main()이 프로그램의 entry point (진입점) 이기 때문입니다. 현재 우리가 따배씨를 통해 C를 공부하고 있는 환경은 OS의 제어 하에 놓인 hosted environment 입니다. 이때, entry point란 OS가 프로그램으로 제어를 넘겨주는 지점을 말합니다. 즉, 프로그램이 실질적으로 동작하기 시작하는 지점이라고 할 수 있습니다. 이러한 진입점은 대부분의 프로그래밍 언어에서 한 개만 존재합니다. 따라서, 진입점이 되는 main 함수를 두 개 이상 만들 수 없습니다. C11 표준문서에 보면 freestanding environment라고 프로그래머가 정한 임의의 방식으로 프로그램을 구동하는 방식이 있고, 이때는 프로그래머가 조작하기에 따라 다를수도 있겠습니다만, 일반적으로 프로그래밍 공부에서 만나기 어려운 경우라고 생각됩니다(저도 잘 모른다는 뜻입니다 :D)

둘째로, Visual Studio에서는 하나의 프로젝트에 동일한 이름을 가진 함수가 여러차례 정의될 수 없습니다. (이는 file scope 변수도 마찬가지 입니다. file scope 변수를 선언과 동시에 정의하는 문장이 여러 C 파일에서 동시에 등장하면 링킹 에러가 발생합니다. -  12.8강 ) 예컨대, main()이 아니더라도 h()라는 함수를 두개 이상의 c 파일에 정의하면, 링킹 에러가 발생하게 됩니다

이는 Visual Studio의 장점이자 단점입니다. 컴파일, 링킹 단계를 분리하고 프로그래머에게 자유도를 주는 환경에서는 각각의 C파일을 따로 컴파일 할 수 있지만, Visual Studio는 프로젝트 단위로 컴파일-링크를 진행하므로 하나의 프로젝트에는 같은 이름의 함수가 여러번 정의될 수 없습니다. 물론, 이건 다른 c 파일의 함수를 불러와 사용하기 위해 prototype을 선언하는 것과는 별개의 얘기입니다.

제 답변에 오류가 있다면 지적 바랍니다:)

1

쏭쌤님의 프로필 이미지
쏭쌤
질문자

답변 감사합니다! 

그렇다면 하나의 프로젝트 안에서 여려개의 소스파일을 작성하는 경우가 있을거라고 생각이 되긴 하는데, 이런 경우에는 어떤 목적을 가지고 그렇게 작성하는지 여쭤봐도 될까요?

예를 들자면 my_first_project 내부에 first_file.c랑 second_flie.c, ...등 여러개의 파일을 작성하는 경우가 있는지, 그런 경우가 있다면 어차피 메인함수는 하나만 선언이 가능한데 , 여러 c파일을 따로 작성하는 이유가 있는지 궁금합니다!

쏭쌤님의 프로필 이미지
쏭쌤

작성한 질문수

질문하기