작성
·
1.3K
0
안녕하세요 :) 질문이 있어 이렇게 글 남깁니다.
제가 강의를 보면서 매 차시 작성하는 코드를 깔끔하게 정리하고자 하나의 프로젝트 안에서 강의마다 소스코드 파일을 하나씩 만들어 가다가 어느 순간 오류가 나더라구요 (아래 오류 코드)
fatal error LNK1169: one or more multiply defined symbols found
그래서 프로그래밍이 처음인 제가 저게 정확하게 무엇인지는 몰라도 one or more multiply defined를 보니 뭔가 중복이 됬다는 것 같아서 중복이 될 만한 int main()을 보니
제가 int main()이 여러개인 상태를 방지하고자 int main1()로 변형해서 놓은 게 겹쳐버려서 생긴 문제더라구요.(실행하고자 하는 소스코드 외의 소스코드 파일에서 int main()꼴은 서로 겹치지 않고 실행되지 않게끔 이름을 바꿈)
서론이 길었네요 죄송합니다.
1) 그래서 제가 묻고자 하는 것은 한 프로젝트 내에서 어떤 함수건 이름을 같게 하면 안 되나요?
2) 그리고 특정 소스코드파일에서 int main()함수가 없다면 그 다음에 있는 함수가 자동으로 실행이 되나요?
3) 번외로 2:42부분에 void say_hello(void) {} 이라고 되어 있는 부분에서 맨 앞의 void는 출력할 값이 없으니 공백?의 뜻을 지니고 있는 void를 쓰는 것이고 ()안의 void는 마찬가지로 입력할 값이 없으니 공백의 의미를 지닌 void를 쓰는 것인가요?
긴글 읽어주셔서 감사합니다
답변 1
1
안녕하세요 :)
1) 한 프로젝트 내에서 어떤 함수건 이름을 같게 하면 안 되나요?
2) 특정 소스코드파일에서 int main()함수가 없다면 그 다음에 있는 함수가 자동으로 실행이 되나요?
1번과 2번은 동시에 답변 드릴 수 있을 듯 합니다.
우선은 네, 프로젝트 내에서 함수 이름이 겹치면 오류가 발생합니다.
예를 들어, 아래 사진을 보세요. 같은 프로젝트 내에 Source.c와 Source2.c 파일을 만들었습니다.
Source.c에는 아래와 같이 main함수와 hello 함수가 있고,
Source2.c에는 아래와 같이 hello 함수가 있다고 해 봅시다.
hello 라는 함수가 중복되어 있죠?
그렇기에 이 프로젝트를 빌드하면 말씀하신 에러가 동일한 에러가 발생합니다.
이 때 Source.c 혹은 Source2.c의 hello 함수를 중복되지 않게 변경하고 컴파일하면
성공적으로 컴파일 되는 것을 볼 수 있습니다.
이 때, 프로젝트를 빌드, 실행하게 되면 가장 먼저 실행되는 것은 main 함수입니다.
이 main 함수가 Source.c에 있든 Source2.c에 있든 해당 파일의 main 함수가 실행됩니다.
가령 바로 위의 사진에서 main 함수는 Source.c에 있었지만,
이 main 함수를 그대로 Source2.c로 옮겨도 실행은 잘 됩니다.
하지만 어떤 파일에도 main 함수가 없어서는 안됩니다.
앞서 언급했듯 프로젝트를 빌드, 실행하게 되면 가장 먼저 실행되는 것은 main 함수이기 때문입니다.
가령 main 함수를 main2라고 이름을 바꾸면 컴파일이 실패합니다.
3) void say_hello(void) {} 이라고 되어 있는 부분에서 맨 앞의 void는 출력할 값이 없으니 공백?의 뜻을 지니고 있는 void를 쓰는 것이고 ()안의 void는 마찬가지로 입력할 값이 없으니 공백의 의미를 지닌 void를 쓰는 것인가요?
네, 정확히는 리턴할 값이 없기 때문에 함수 맨 앞에 void라고 쓴 것이고
인자로 받을 값이 없기 때문에 ( ) 안에 void를 쓴 것입니다.
답변이 되었기 바랍니다.
추가적인 질문이 있다면 언제든 댓글 주세요!
감사합니다.
1) main 함수나 실행되는 함수에서 호출이 되면 (예를 들어 main 함수에 foo라는 어떤 함수가 있었는데 foo 함수가 hello함수를 호출한 경우) 실행이 됩니다. 아마 이 부분은 '다른 소스 코드 파일을 포함시키는 방법 (헤더 파일)'을 학습하다 보면 자연히 해결될 것 같아요 :)
2) 파일명과 관련없이 main 함수가 있는 파일의 main 함수가 실행됩니다. "가장 먼저 파일이 실행된다"라고 생각하지 마시고 "가장 먼저 main이라는 함수가 실행된다" 라고 생각해주세요. 이 또한 1) 과 동일합니다, 다른 파일의 소스 코드의 내용을 include하여 실행하는 방법을 학습하신다면 아마 자연히 해결될 것으로 보입니다 :)
감사합니다!!
그런데 1) main함수 이외의 프로그래머가 만든 함수(ex. hello, hello2)는 반드시 main함수 안에서 호출해야만 작동시킬 수 있나요? 저는 밖에서 호출해보니 오류가 떠서 애당초 안 되는 것 같더라구요..
2) 선생님께서 말씀하신대로 Source.c에 main, hello함수가, Source2.c에 hello2함수가 있다 했을때 본 프로젝트를 실행하면 main함수가 존재하는 Source.c부터 실행되고 그 다음으로 Source2.c를 실행하나요?
결과를 확실히 보이기 위해 제가 직접 테스트 하여 printf함수를 쓸려고 했지만 1)이 해결되지 않아 main함수 없이 제가 만든 함수만 있는 소스코드파일은 그 함수를 실행할 방법이 안 보이네요..(main 함수를 또 만들면 오류가 생겨버리니,,,)