문제

헤더 파일 Port.h, port.c 및 main.c가 있습니다.

다음과 같은 오류가 발생합니다. 'Ports'는 정의되지 않은 Struct 'Port_t'를 사용합니다.

.h 파일의 구조물을 선언하고 .c 파일에 실제 구조를 갖는 것은 괜찮다고 생각했습니다.

포트 .C 파일에 일부 데이터를 숨기고 싶을 때 전달 선언이 필요합니다.

내 포트에는 다음이 있습니다.

/* port.h */
struct port_t;

port.c :

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

Main.C :

/* main.c */
#include <stdio.h>
#include "port.h"

int main(void)
{
struct port_t ports;

return 0;
}

제안에 감사드립니다.

도움이 되었습니까?

해결책

불행히도 컴파일러는의 크기를 알아야합니다. port_t (바이트) main.c를 컴파일하는 동안 헤더 파일에 전체 유형 정의가 필요합니다.

다른 팁

내부 데이터를 숨기고 싶다면 port_t 구조 표준 라이브러리가 처리하는 방법과 같은 기술을 사용할 수 있습니다. FILE 사물. 클라이언트 코드 만 다루는 것입니다 FILE* 항목, 따라서 그들은 필요하지 않습니다 (실제로, 일반적으로 일반적으로 할 수는 없습니다). FILE 구조. 이 방법의 단점은 클라이언트 코드가 단순히 변수를 해당 유형으로 선언 할 수 없다는 것입니다. 그들은 포인터 만 가질 수 있으므로 일부 API를 사용하여 객체를 만들고 파괴해야합니다. 모두 객체의 사용은 일부 API를 통해 이루어져야합니다.

이것에 대한 장점은 당신이 How에 대한 멋진 깨끗한 인터페이스를 가지고 있다는 것입니다. port_t 객체를 사용해야하며 개인 물건을 비공개로 유지할 수 있습니다 (비 개인적인 것은 클라이언트가 액세스 할 수있는 getter/setter 기능이 필요합니다).

파일 I/O가 C 라이브러리에서 처리되는 방식과 같습니다.

내가 사용하는 일반적인 솔루션 :

/* port.h */
typedef struct port_t *port_p;

/* port.c */
#include "port.h"
struct port_t
{
    unsigned int port_id;
    char name;
};

기능 인터페이스에서 port_p를 사용합니다. Port.h에서 특별한 malloc (및 무료) 포장지를 만들어야합니다.

port_p portAlloc(/*perhaps some initialisation args */);
portFree(port_p);

다른 방법을 추천합니다.

/* port.h */
#ifndef _PORT_H
#define _PORT_H
typedef struct /* Define the struct in the header */
{
    unsigned int port_id;
    char name;
}port_t;
void store_port_t(port_t);/*Prototype*/
#endif

/* port.c */
#include "port.h"
static port_t my_hidden_port; /* Here you can hide whatever you want */
void store_port_t(port_t hide_this)
{
    my_hidden_port = hide_this;
}

/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
    struct port_t ports;
    /* Hide the data with next function*/
    store_port_t(ports);
    return 0;
}

일반적으로 헤더 파일에서 변수를 정의하는 것은 좋지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top