Callback 함수의 signature가 다를 때 보통 어떻게 하시나요?

twinwings의 이미지

typedef boolean (*Callback)(void* user_data);
boolean callback_register(Callback callback_fn, void* user_data);
 
boolean my_function(int a, int b, int c) {
 ...
}
 
typedef struct _MyFunctionWrapperArg {
  int a;
  int b;
  int c;
}MyFunctionWrapperArg;
 
boolean my_function_wrapper(MyFunctionWrapperArg* arg){
  return my_function(arg->a, arg->b, arg->c);
}

등록시:

callback_register((Callback)my_function_wrapper, arg);

전 보통 이렇게 작성하는데 더 좋은 방법이 있나요?

shint의 이미지

콜백함수'는 등록하자마자. 호출되지는 않습니다.
대신. 프레임구조에 따라서. 등록하자마자. 호출이 되는 경우도 있으니. 주의해야 합니다.

_cdecl,_fastcall,_stdcall 함수 호출 방식 (콜백함수는 아니지만. 호출방식 설명입니다.)
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=149029804&qb=X2NkZWNs&enc=utf8&section=kin&rank=2&search_sort=0&spq=0

윈도우에서는 윈도우 프로시져를 콜백(호출)하여 사용하기도 합니다.

윈도우 콜백함수
http://kldp.org/node/115032

//윈도우 CallBack함수
//http://blog.naver.com/kjio9710?Redirect=Log&logNo=220519950998

//http://msbang.co.kr/80188333982

#if 0
//----------------------
//함수 포인터 호출 방법
//----------------------
typedef bool (*CALLBACK)(void* user_data);
CALLBACK cf = NULL;
 
void CALLBACK_REGIST(CALLBACK handler)
{
    cf = handler;
    printf("CALLBACK_REGIST\n");
    cf((void*)NULL);
}
 
CALLBACK CALLBACK_FUNCTION(CALLBACK p, void* user_data)
{
    printf("CALLBACK_FUNCTION\n");
}
 
int main(int argc, char** argv) 
{
    CALLBACK_REGIST((CALLBACK)CALLBACK_FUNCTION);
	return 0;
}
#endif

//http://kldp.org/node/154070

//----------------------
//콜백함수 호출 방법
//----------------------
 
typedef struct _MyFunctionWrapperArg {
  int a;
  int b;
  int c;
}MyFunctionWrapperArg;
 
typedef bool (*CALLBACK)(void* user_data);
CALLBACK callback_register(CALLBACK callback_fn, void* user_data)
{
    printf("callback_register\n");
}
 
CALLBACK my_function(int a, int b, int c)
{
    printf("my_function\n");
}
 
CALLBACK my_function_wrapper(MyFunctionWrapperArg* arg)
{
    printf("my_function_wrapper\n");
    return my_function(arg->a, arg->b, arg->c);
}
 
int main(int argc, char** argv) 
{
    callback_register((CALLBACK)my_function_wrapper, NULL);
	return 0;
}

callback msdn
http://www.google.co.kr/search?hl=ko&source=hp&biw=&bih=&q=callback+msdn&gbv=2&oq=callback+msdn&gs_l=heirloom-hp.3..0j0i30j0i5i30l8.917.4827.0.5140.15.13.1.1.1.0.156.1543.0j13.13.0....0...1ac.1.34.heirloom-hp..0.15.1556.lPUlyQOwCO4

callback
http://www.codeproject.com/search.aspx?q=callback&x=10&y=4&sbo=kw

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

twinwings의 이미지

제가 콜백함수를 모르는게 아닙니다.(glib, winapi 등의 프레임워크는 이미 다뤄봤습니다.)

그리고 당연히 바로 호출되는게 아니겠지요. 비동기를 위해 콜백함수라는 인터페이스를

개발된것인데, 바로 호출되는게(동기적으로 호출되는게) 이상하지 않습니까.. 또한

C++에서 비슷한 경우로 function signature의 개수가 적어지는 경우

std::bind 라는 템플릿등을 제공하는 것 또한 알고 있습니다. 혹은 std::function 이라던지..

단지 저는 "C"에서의 콜백함수를 좀 더 편하게 사용하는 방법이 있는지, 특히

function signature가 다를 경우-특히 매개변수가 더 많아 질 경우-에 대한 질문인데

엉뚱한 답변을 하고 계십니다.

gilgil의 이미지

C++라면 boost::any의 list(혹은 vector)를 이용하여 넘기면 될 것 같은데...
C라면 좀 힘들겠네요. va_list를 이용하면 되지 않을까요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.