구조체 멤버 함수 질문
typedef struct tag {
// variable
....
// method
int (*create)(struct tag*, int, void*);
int (*enque_item)(struct tag*, struct req_tag, int);
} tag_t, *tag_p;
int create(struct tag* this, int size, void* arg)
{
//~~~~
}
이런식으로 구조체 내에 멤버함수를 만들고 외부에 함수를 구현하여 놓았습니다.
그런 다음에 main.c 에서 다음과 같이 할려고 하는데요.
tag_t worker;
worker.create = create; // 이렇게 하면 create 가 선언되어 있지 않다고 컴파일 에러가 납니다.
그래서 다음과 같이 수정하여 컴파일 에러는 고쳤는데요
typedef struct tag {
// variable
....
// method
int (*create)(struct tag*, int, void*);
int (*enque_item)(struct tag*, struct req_tag, int);
} tag_t, *tag_p;
int create(struct tag*, int, void*);
create 함수의 프로토타입을 또 tag.h 에 써주자니 중복된 코드가 남아 있어서 보기 안좋더라고요.
혹시 이런식의 문제는 어떻게 코딩하는 것이 효과적인지 조언부탁드립니다.
그냥 구조체 안에서 빼버리고 바깥에 한번만 쓰는 식으로 해야될까요??
중복같지 않습니다.
중복같지 않습니다.
구조체안의 create는 함수 포인터이고, 구조체 밖의 create는 구조체안의 함수 포인터와 같은 타입의 함수일 뿐입니다. 구조체 밖의 함수는 이름이 create가 아닌 다른 어떤 이름이라도 가질 수 있기 때문에, 이것을 중복이라고 하기는 어려울것 같습니다.
--------------------------------------------------------------------------------------
조금씩이라도 전진한다.
선언과 구현이 구분
선언과 구현이 구분 되어있는 c/c++의 특성입니다.
어떤 함수나 변수와 같은 식별자를 사용하기 위해서는 그게 무엇인지 설명하는 것이 있어야합니다.
c/c++은 파일단위로 컴파일(전체 프로젝트 단위가 아닙니다.)하기 때문에 해당 파일을 컴파일 할 때
다른 소스파일에 있는 선언은 컴파일러가 전혀 알지 못합니다. 그렇기 때문에 선언은 헤더로 빼서
include를 해주는 것입니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
댓글 달기