[완료] 구조체 안에서의 함수 포인터.

zipsinworm의 이미지

여러 소스를 보다보면 예를들어.

typedef struct _LIB_HANDLE_
{
.....
.....
.....
T_ALLOC Alloc;
DE_ALLOC Dealloc;
}
LIBHANDLE ;

이런 구조체가 있습니다. 궁금한건 T_ALLOC과 DE_ALLOC 입니다.
따라가서 찾아보니
typedef void* (*T_ALLOC)(unsigned long);
typedef void (*DE_ALLOC)(void*);
이렇게 정의가 되어 있었습니다.

제가 생각하기에는 함수포인터를 사용하는거 같은데 그럴려면 T_ALLOC함수와 DE_ALLOC함수가
존재 해야 하지 않나 생각됩니다. 근데 아무리 찾아봐도 위에 두 함수는 찾아볼 수가 없었습니다.

어떤 의미로 이 구조체를 쓰고 '') 저렇게 정의 하여 사용하는지 이해가 잘 안갑니다.

이런 문법도 존재하는지요..? 궁금합니다.

익명사용자의 이미지

Alloc와 Dealloc 두 변수가 가리키는 함수의 이름이 꼭 T_ALLOC 혹은 DE_ALLOC일 필요는 없습니다.

void * func(unsigned long ul)

void func(void * p)

이런 형태를 갖는 함수 모두를 가리킬 수 있습니다. 매개변수와 함수의 이름은 뭐든지 상관이 없습니다.

이런 말씀 드리면 실례가 될지 모르겠습니다만,
함수 포인터와 typedef에 대해서 아직 제대로 이해하지 못하신 듯 합니다.
책보고 기초 문법부터 다시 공부하세요.

irondog의 이미지

쓰시는 C언어 매뉴얼에서 typedef 관련 부분을 찬찬히 읽어 보시기 바랍니다.
함수 프로토타입 선언에 대해 잘 기술 되어 있을 것입니다.

typedef void voidfn ();
voidfn fatal;

이런식의 이용이 가능 하지요.

zipsinworm의 이미지

매개변수와 함수이름이 전혀 상관 없고 반환형이랑 매개변수 형만 같다라면 된다는건데 저런 구조체를 쓰는 이유는 뭘까요?

gimmesilver의 이미지

동적으로 필요한 함수를 등록해서 사용하기 위해서 사용합니다.
콜백이나 플러그인과 같은 효과를 줄 때 유용합니다.
예를 들어 미디어 플레이어의 경우

typedef struct _CodecInfo {
    int type_;
    void (*codec)(...);
} Codec;

이런식의 구조체를 정의해놓고 미디어 플레이어 초기화 시 각 코덱 dll에 있는 코덱 함수를 저 구조체 테이블에 등록시키면 나중에 파일의 타입을 확인해서 해당 코덱 타입에 맞는 함수를 호출하는 용도로 사용할 수 있습니다.

http://agbird.egloos.com

------------------------
http://agbird.egloos.com

zipsinworm의 이미지

그렇군요. 어떤 여러 파일이 있다고 해서 각각 개별적으로 처리하는 것이 아니라 저런 구조를 이용함으로써 동적으로 핸들링 할 수 있군요.

감사합니다. 덕분에 정말 중요한 것을 알았습니다~ ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.