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

상인김님의 프로필 이미지
상인김

작성한 질문수

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

14.14 구조체 파일 입출력 연습문제

구조체 파일과 함수를 헤더파일에 선언할 때 질문입니다.

작성

·

152

1

0.png1.png2.png3.png

struct 파일에 저장되어있는 문자열을 파일 스트림 fr로 옯긴 후, 그걸 다시 struct 파일로 옮기는 내용입니다.

보기 복잡해서 헤더파일로 나눈 후 정리를 하고 싶은데, header.h와 header.c로 나누어서 각각 함수의 프로토타입과 바디를 적어주었는데, 이후 어째서인지 main.c(소스.c)에 선언되어있는 변수를 인식하지 못하고 컴파일 에러가 나옵니다.

이 경우, 바디가 적힌 header.c에는 해당 변수들을 전부 다시 선언해줘야하나요? 혹은 main.c에 있는 변수나 함수에게 extern을 첨가해야 할까요?

답변 3

1

상인김님의 프로필 이미지
상인김
질문자

f.png

강의를 보았지만 전역 구조체를 설정하는 것에 어려움을 겪어 다시 질문드려봅니다;;

답볍주셨던 글에 달린 사진에서 다른 것은 건드리지 않고,

extern struct book_info book_list; 만을 header.c 파일에 추가해주었는데, 그 안의 함수들은 여전히 구조체를 인식하지 못했습니다.

extern struct book_info book_list{

char book[SLEN];

char author[SLEN];

};

으로 수정해서 올리면 인식이 되지 않는 컴파일 에러는 없어지지만, book_list가 재정의되는 또다른 컴파일 에러가 발생합니다.

이에 관해서 저와 비슷한 경우가 없는 지 찾아보았는데, 상당수의 사람들이 제가 구조체를 선언한 것과 다르게

typedef struct{

char book[SLEN];

char author[SLEN];

}book_list;

로 선언하고, extern book_info book_list;

를 통해 전역 구조체로 만드는 것을 알 수 있었습니다.

다만, 제가 구조체를 선언한 방식 역시 엄연히 하나의 옳은 방식인데, 이 방식으로 올바른 전역 구조체 선언이 안되는 이유를 몰라서 도움을 청합니다..!

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

우선 먼저, 첨부해주신 코드를 꼼꼼히 살펴보며 답변을 드리고자 노력해보았으나,
header.hheader.c 파일의 코드의 내용이 온전히 첨부되지 않은 것 같아 답변을 드리는 것에 있어서 어려움이 있는 점을 양해 부탁드립니다. 🥲

(첨부해주신 header.c 의 코드에서 함수의 경우 반환형이 명시되어있지 않고, header.h 에서의 함수 선언부분과 매개변수의 자료형이 일치하지 않는 등의 부분, 그리고 copy_structure() 함수의 의도 부분들에 대해서 제가 유추해내서 답변을 드리기가 조금 어렵네요.)

 

질문 주신 내용에 있어서 답변을 드려보자면,
말씀해주신 typedef 키워드의 사용 유무가 아니라, book_info 타입의 구조체 변수가 '배열' 로써 사용된다는 점에 초점을 맞추어 보시면 도움이 되실 것 같습니다.

정확한 코드의 내용을 제가 모르지만,
main.cppmain() 함수 내에서 book_info 타입의 변수가 동적 메모리 할당을 통해 구조체의 '배열' 로써 다루어지고 있다는 점을 생각해보시면 좋을 것 같습니다.

따라서, 전역 변수 역시 구조체의 단일 변수가 아니라, 메모리를 동적으로 할당 받을 수 있는 구조체의 포인터여야 합니다.

만약, 이해가 어려우시거나 문제 해결이 어려우시다면, 편하게 추가 댓글 남겨주세요.

다만, 질문자님께서 현재 어려움을 겪고 계시는 코드 파일들을 그대로 첨부해주시면 제가 더 도움이 되는 답변을 드릴 수 있을 것 같습니다. 🙏🫡

1

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

네, 말씀해주신 상황 같이 서로 다른 소스 파일들 간의 변수를 연결시켜 주기위한 경우에서는 extern 키워드를 사용하시는 방법이 옳습니다.

header.h 파일에 extern 키워드를 사용하셔서 전역 변수를 '선언' 한 후, main.c 파일에서 해당 전역 변수를 '정의' 하셔서 사용하시면 컴파일러가 필요한 변수의 선언과 정의를 모두 잘 찾을 수 있게 됩니다.

관련된 내용은, 강의 9.11 헤더 파일 만드는 방법 과 강의 12.8 정적 변수의 외부 연결 external linkage 를 복습해보시면 도움이 되실 것 같습니다.

상인김님의 프로필 이미지
상인김
질문자

답글을 단다는 게 그만 답변으로 등록되버렸네요..! 항상 수고하십니다

안녕하세요? 질문&답변 도우미 Soobak 입니다.
답변으로 등록해주셔도 괜찮습니다. 새로 작성해주신 글에 답변을 드렸습니다.
좋은 말씀 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

상인김님의 질문에 대해, 조금더 상세한 안내가 필요할 것 같습니다. 헤더 파일에서의 함수 프로토타입 선언과 소스 파일(.c)에서의 함수 구현 분리는 C언어 프로그램 구조의 기본이며, 이를 통해서 코드의 모듈성과 재사용성을 높일 수 있습니다. 하지만, 질문하신 구체적인 문제, 즉 main.c에 선언된 변수를 header.c에서 인식하지 못하는 컴파일 에러와 관련하여, 몇 가지 가능한 상황을 설명하고 관련된 기존 답변을 안내드리겠습니다.

  1. 변수의 Scope와 extern 키워드 사용

    • 변수가 main.c에 정의되어 있는 경우, 해당 변수를 header.c에서 직접 접근하려면 변수 선언 앞에 extern 키워드를 붙여 전역 변수임을 명시해야 합니다. 이는 header.c 또는 다른 C 파일에서 main.c에 정의된 전역 변수를 사용하고자 할 때 필요한 절차입니다.
    • 예시:
      ”`c
      // main.c
      int globalVar = 42;

    // header.c or another C file
    extern int globalVar;
    “`

  2. 함수 프로토타입과 구현 분리

    • 함수의 프로토타입은 헤더 파일(.h)에 선언하고, 구현체는 소스 파일(.c)에 작성합니다. 이를 통해 다른 소스 파일에서 헤더 파일을 include 하여 해당 함수를 사용할 수 있습니다.

다음은 구조체와 관련된 파일 입출력, 그리고 전역 변수 사용과 관련된 예시 답변입니다:

  • 동적할당 구조체에서는 구조체의 동적 할당 방법과 관련된 질문과 답변이 있습니다. 동적 할당된 구조체 배열과 관련된 함수들을 다루고 있으며, 이는 구조체와 파일 I/O를 함께 사용할 때 유용할 수 있습니다.

문제를 해결하기 위해 체크리스트:
- main.c에서 사용된 모든 전역 변수에 대해 header.c에서 extern 키워드를 사용했는지 확인하세요.
- header.h에 함수의 프로토타입이 올바르게 선언되어 있고, header.cmain.c에서 해당 헤더 파일이 include 되어 있는지 확인하세요.
- 컴파일러가 제시하는 에러 메시지의 상세 내용을 분석하여, 문제를 좁혀나가세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

상인김님의 프로필 이미지
상인김

작성한 질문수

질문하기