[%]
c 로 oop 흉내 내기 2
익명(218.147)
2020-03-23 23:45
추천 1
전에 설명한 c 로 만든 플러그인 인터페이스 문서에 있는 함수 포인터를 활용하면
https://gall.dcinside.com/mgallery/board/view/?id=github&no=7138&search_head=30&page=1
더욱 그럴싸하게 됨. 결국엔 glib 비스므리하게 됨. 이런 짓을 왜하냐면 호환성 때문이죠.
다양한 플랫폼(BSD 유닉스, 리눅스, MS윈도우, 애플, 안드로이드)에서 약간만 수정해서 작동되길 바라고,
다양한 동적 언어(파이썬, 루비, 자바스크립트 등)에서 작동되길 바라면 c 를 이렇게라도 사용하게 됩니다.
c를 사용하여 라이브러리를 만들면 정말 다양한 환경에서 사용될 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {
TIAN_OBJECT
,
TIAN_PLUGIN
};
typedef struct _TianObject
{
int type
;
int ref_count
;
} TianObject
;
typedef struct
{
TianObject base
;
char *name
;
} TianPlugin
;
TianPlugin
*tian_plugin_new
(char *name
)
{
TianPlugin
*plugin
= calloc
(1, sizeof (TianPlugin
));
plugin
->name
= strdup
(name
);
plugin
->base
.type
= TIAN_PLUGIN
;
plugin
->base
.ref_count
++;
return plugin
;
}
int main
(int argc
, char **argv
)
{
TianPlugin
*plugin
= tian_plugin_new
("name");
puts
(plugin
->name
);
return 0;
}
요즘은 함수 포인터 써도 디버깅 쉬움?
글쎄요.. .함수 포인터 써서 에러나는거야... 주로 NULL 참조 때문인데, if (plugin->function) plugin->function () 이렇게 하면 에러 하나도 안 나는데.. 함수 포인터로 디버깅 문제 겪은 적이 거의 없어서..
디버깅은 멀티 스레드, poll 같은거 써서 다중 입출력할 때나 어렵지... 그외 디버깅은 모두 printf 문을 삽입하면 쉽지 않나
함수 포인터 자체를 참조하는 것 보다는 함수 호출 시 들어가는 파라미터나 함수 코드 내의 문제를 찾는게 좀 더 번거로웠죠
그리고 c로 만들면 serialize, deserialize 도 겁나 쉬움. TianPlugin *plugin 에 sizeof (TianObject) 크기로 메모리 할당했으니 그만큼 그냥 파일에 쓰기 하고. char * 에 할당된 strlen (name) + 1 크기 만큼 쓰기 하면 됨. 그리고 deserialize 할 때는 sizeof (TianObject) 만큼 읽고 (TianObject *) 캐스트하고, strlen (name) + 1 만큼 읽고 그걸 (char *) 캐스트하면 deserialize 완료.