[C] 헤더 파일로 분리하여 코드를 짤 때, 사용자 선언 구조체를 어디에 입력해야 하는지
조회수 4333회
헤더 파일을 직접 작성하여 코드를 짜던 중, 궁금한 사항이 생겨 질문드립니다.
-- myheader.h
#pragma once
typedef struct node {
int data;
struct node *next;
}NODE;
typedef struct {
int count;
NODE *head;
}plist;
void get_group(plist** group);
이런 myheader.h 파일과 이 헤더에 들어갈 함수를 myheader.c 파일에 작성하였습니다.
-- myheader.c
#include<stdio.h>
void get_group(plist** group)
{ // 생략
}
제가 질문할 점은 다음과 같습니다.
(1) 이렇게 사용자 정의 구초제를 헤더 파일에만 선언하게 되면, 화면에 빨간 줄이 표시되며 에러임을 보여줍니다. 그런데 이 사용자 구조체를 myheader.h에도 선언하고, myheader.c에도 선언하면, 더이상 화면에 빨간 줄이 표시되지 않는다는 점입니다. 제가 혼란스러운 점은 이 사용자 구조체를 두 파일 중 어디에 선언하야 하는 것이냐 입니다. 헤더 파일에만 선언한다 / c파일에만 선언한다 / 둘다에 선언한다 둘 중 어떤 방식이 옳은 것일까요?? 뭔가 헤더 파일과 그것의 c 파일의 관계에 대해 제가 간과하는 점이 있어 생기는 문제인 것 같습니다 ㅜㅠㅜㅠ
(2) 헤더파일에 다른 헤더파일을 include 해도 되는지 여부 코드를 작성하던 중, 제가 정의한 헤더파일에 string.h 등의 헤더의 함수를 쓸 필요가 있더군요. 그런데, 이때도 이 헤더를 include하는 구문을 myheader.h에 include해야 하는지, 아니면 myheader.c에 include 해야 하는지 혼란이 옵니다.....
혹시 헤더 파일과 관련된 자료가 있거나, 도움을 주실 분이 계시다면 꼭 도와주세요 ㅜㅠㅜㅠㅜ 부탁드립니다!! (혹시 제 코드에 제가 발견하지 못한 또다른 오류가 있다면 코멘트 해주세요!)
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
헤더파일은 일종의 인터페이스라고 생각하면 좋겠습니다.
헤더파일만 보면 "아~이러저러한 기능들이 제공되는구나..." 하고 알 수 있다는 의미입니다.
구조체는 당연히 header 파일에 정의되어야 합니다.
구조체를 파라미터로 넣을 수도, 포인터로 정의하여 리턴값으로 받을 수도 있기 때문입니다.
c 파일의 상위를 아래와 같이 사용하면 됩니다.
#include<stdio.h> #include "myheader.h"
물론 b.h 에서 a.h에 선언된 것을 사용해야 된다면 b.h에 a.h 가 include 되어야 합니다. 이 부분은 판단하면 됩니다.
여러번 h 파일이 include 되는 건 아닐까 라고 생각할 수 있는데 #pragma once 코드나 아래의 방지코드를 이용해서 방지합니다.
#ifndef MY_H_ /* 중복방지 */ #define MY_H_ ... ... #endif
- 답변 감사합니다. 그런데, 답변의 내용 중에 이해가 잘 안 되는 것이 myheader.c의 전처리기에 #include"myheader.h"를 포함하라고 하셨는데, 제가 main함수 가 있는 c 파일에서 쓸 함수를 myheader.h에 선언(declaration)하고, 함수 정의를 myheader.c에 하는 것입니다. 그런데, 이 myheader.h를 mydeader.c에 include 해도 되는 건지 잘 모르겠네요.... ㅜㅠㅜㅠ 알 수 없는 사용자 2018.12.7 12:40
- 제가 참고한 사이트의 링크를 걸어드리겠습니다. https://dojang.io/mod/page/view.php?id=522 와 http://blog.naver.com/PostView.nhn?blogId=phh0606c&logNo=10174041285&parentCategoryNo=&categoryNo=7&viewDate=&isShowPopularPosts=true&from=search 입니다. 알 수 없는 사용자 2018.12.7 12:40
댓글 입력