2011-02-28 3 views
5

나는이 중국어 블로그에서이 질문을 얻는다. http://chenyufei.info/blog/2011-02-28/wrap-c-function-closure-gcc-nested-function/ 저자는 C 언어로 클로저를 사용하고 싶다. GCC는 중첩 된 기능 (그리고 클로저)을 가지고있다. 예 :랩과 콜 C 함수에 대해서

typedef int (*func_t)(int arg); 


int foo(int a) { 

    return a + 1; 

} 


func_t create_wrap_function(func_t f) { 

    int wrapped(int arg) { 

     // call original function 

     int val = f(arg); 

     fprintf(log_func_call, "arg: %d ret: %d", arg, val); 

     return val; 
    } 

    return wrapped; 
} 

그러나 일반적인 해결책은 아닙니다. create_wrap_function은 func_t가 형식을 제한하기 때문에 함수 형식이 고정되어 있습니다.

아시다시피 루아는 폐쇄 기능을 가지고 있으며 C 함수도 호출 할 수 있습니다. 구현하고자하는 것 : 호출하고자하는 함수는 foo1과 foo2이며, args와 반환 값의 유형이 다릅니다. 그 다음, 루아 함수에 foo1은 1 패스 정상적인 프로세스처럼 기능 foo1은 호출의 Do_Lua_Wrap에서

lua_returnValue returnValue1 = Do_Lua_Wrap(__FILE__, __LINE__, foo1, 1); 
lua_returnValue returnValue2 = Do_Lua_Wrap(__FILE__, __LINE__, foo2, "string data", 1.2345); 

:

int foo1(int a) { 
    ... 
    return intValue; 
} 

double foo2(char* str, double a) { 
    ... 
    return dblValue; 
} 

는 C 클라이언트에서, 같은 함수를 호출한다. 그런 다음 foo2와 하나의 char * 및 하나의 double 값을 Lua 함수에 전달한 다음 일반 프로세스와 마찬가지로 foo2 함수를 호출합니다. 루아 함수에서는 FILELINE 에 대한 정보를 기록하고 함수 인수에 대한 추가 로그를 작성할 수 있습니다.

하지만 Do_Lua_Wrap 함수를 C 및 Lua에 작성하는 방법에 대해서는 모르겠다. 가능합니까?

가능하면 조언을 해 주시겠습니까?

답변

2

분명히 variadic function에 관심이 있지만, 문제는 루아 스택에 푸시 할 인수 유형을 결정하는 것입니다. 나는 몇 가지 방법을 추천 해드립니다 :

  1. 은 첫 번째는 형식 문자열 라 종종 더 높은 수준의 언어에서 사용되는 printf 가족이나 바이너리 포장 형식 을 포함하는 것입니다. 예를 들어, 을 lpack 루아 모듈에 사용 된 형식 패턴으로 봅니다. 열쇠는 형식 문자열을 통해 검색하여 수를 결정하고 어떤 종류의 인수가 제공되는지 확인하십시오.

  2. variant 유형을 구현할 수도 있습니다. 각 인수 은 구조로 래핑되어야합니다. 또한 총 개의 인수는 첫 번째 매개 변수로 으로 제공되어야합니다.

  3. 마지막으로 가변적 인 함수를 사용하는 대신 두 개의 배열에서 인수를 전달할 수 있습니다. 첫 번째 배열 은 두 번째 배열에 void * 포인터의 대상에 해당하는 열거 형 을 포함합니다. 이 방법을 사용하려면 클라이언트 코드를 유지하는 데 가장 많은 집인 이 필요하지만 상당히 입니다.어레이의 길이를 지정하는 인수 또는 하나 또는 두 어레이의 끝에 센티넬 값이 필요합니다.

바라건대, 그 중 하나의 방법이 효과적 일 것입니다. 개인적으로는 첫 번째 옵션으로 가서 lpack 코드를 가이드로 사용합니다. 귀하의 질문에 지정된 함수 서명에 가장 가깝습니다.

+0

대답은 훌륭합니다! – sagasw