나는이 중국어 블로그에서이 질문을 얻는다. 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 함수를 호출합니다. 루아 함수에서는 FILE과 LINE 에 대한 정보를 기록하고 함수 인수에 대한 추가 로그를 작성할 수 있습니다.
하지만 Do_Lua_Wrap 함수를 C 및 Lua에 작성하는 방법에 대해서는 모르겠다. 가능합니까?
가능하면 조언을 해 주시겠습니까?
대답은 훌륭합니다! – sagasw