• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

3분 48초 부근 질문 있습니다.

21.12.22 12:29 작성 조회수 205

0

16.6에서는 다른 파일에 있는 함수를 실행해서 주소를 비교할 때 함수는 선언할 때 default 값이 extern 이기 때문에 앞에 static이 없는 상태로 main.c에서 my_function.c에 있는 함수 print_address를 사용했는데요

이번 강의에서는 DifferentFile.h에 있는 different_func_in_different_file()를 사용할 때 앞에 static을 붙이시고 그것을 main.c에서 #include DifferentFile.h를 한 다음에 different_func_in_different_file()를 사용하고 있습니다.

이때 #include가 지금까지는 거의 복사, 붙여넣기 수준의 예제로 공부하고 있기 때문에 main.c에서 DifferentFile.h안에 사용된 static으로 정의된 함수를 #include DifferentFile.h로 가져온다면 결국은 main.c에서 static인 different_func_in_different_file()를 사용하는 것인데 어떻게 파일 이름이 다르게 나오는지 잘 이해가 가지 않습니다.

static인 함수는 BSS에 저장이 되지만 다른 파일에서 불러올 때 그 파일에서만 visible하기 때문에 같은 이름으로 접근이 가능한 메모리가 BSS 메모리 공간에 하나 더 생기는 것으로 배웠고 16.6에서 주소가 다르게 나오는 것으로 확인할 수 있었는데요. 

그렇다면 현재 Different_func_in_different_file()는 static으로 정의가 되어있기 때문에 DifferentFile.h에 있는 Different_func_in_different_file()에 접근하는 것이 아니라 main.c에서 #include에 의해서 복사, 붙여넣기 된 static인 different_func_in_different_file()에 접근을 하는 것이므로 DifferentFile.h 파일의 위치를 문자열로 나타내는 것이 아니라 main.c 파일의 위치를 문자열로 나타내야되는 것이 아닌가요?

제가 이해한 바로는 #include의 특성상 헤더파일의 함수가 static이냐 extern이냐에 따라서 함수의 결과값이 다르게 나올 것으로 예상이 되는데 어떤 이유로 static과 extern의 __FILE__의 값이 같게 나오는지 궁금합니다.

답변 1

답변을 작성해보세요.

1

안녕하세요? 거의 끝까지 오셨네요. 꼼꼼하게 공부해나가고 계시군요.

질문을 정확히 이해하기가 어렵습니다만, 이쪽 부분은 저도 컴파일러 전공이 아니라서 강의에서 설명드린 것 이상의 내용은 직접 찾아보셔야할 것 같습니다.

 

thd2tn님의 프로필

thd2tn

질문자

2021.12.23

직접 답변달아주셔서 영광입니다 교수님! 저의 질문은 간단하게 요약하자면

DifferentFile.h의 파일에서 static으로 정의되어 있는 different_func_in_different_file()를 main.c에서 #include DifferentFile.h를 해서 different_func_in_different_file()를 사용했음에도 불구하고 어떻게 DifferentFile.h의 파일위치를 출력해줄 수 있는가 였습니다!

아까 코드는 잠깐 봤는데도 상황이 이해가 가지는 않네요. 질문을 바꿔서 생각해보면 왜 출력을 못해줄거라고 생각하셨나요? 컴파일러가 모르는 함수가 있을 수 있나요?

thd2tn님의 프로필

thd2tn

질문자

2021.12.23

16.6 강의 16분 50초를 보면 static 함수가 정의된 헤더를 다른 파일에서 #include 했을 때 주소값이 서로 다르게 나오는 것을 확인하고 각각의 파일에서 BSS에 새로운 메모리 공간을 갖는다고 이해했습니다.

그래서 현재 여기에서도 static 함수가 정의되어있는 헤더를 #include 했으므로 현재 파일의 scope를 가지는 static 함수의 메모리 공간이 저장되어있는 BSS 주소가 새로 생겨난다고 생각해서 main.c 파일의 주소를 가리키는 것이 맞다고 생각했습니다. 반대로 extern이면 BSS의 주소가 하나이고 외부 파일에서 linking을 통해서 접근을 하는 것이므로 DifferntFile.h 파일의 위치를 가리킨다고 생각했습니다.

여기 보니까 __FILE__이 로그 용도로 쓰인다고 하는걸 보니 그거랑은 분리해서 생각하셔야할 수도 있겠네요.

https://www.tutorialspoint.com/what-are-file-line-and-function-in-cplusplus

thd2tn님의 프로필

thd2tn

질문자

2021.12.23

제가 스스로 했어야하는 일을 교수님이 대신하게 되어서 죄송스럽네요.. 답변 정말 감사합니다! 비전공이지만 열심히 정진해서 C++까지 완강하도록 하겠습니다!

호기심을 갖는 것은 좋은 일입니다. 오히려 제가 현실적인 이유로 인해 모든 부분을 다 자세히 도와드리지 못하는 것이 아쉽습니다. 문법 공부는 계속 잘 해내실 것 같고 앞으로는 아이디어를 내고 실제로 만들어 보는 쪽으로 해보시면 빠르게 실력이 쌓일겁니다.