[C] 헤더 파일로 분리하여 코드를 짤 때, 사용자 선언 구조체를 어디에 입력해야 하는지

헤더 파일을 직접 작성하여 코드를 짜던 중, 궁금한 사항이 생겨 질문드립니다.

-- 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 
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.