2010-03-25 3 views
4

나는 Lua를위한 D2 바인딩을 쓰고있다. 이것은 Lua 헤더 파일 중 하나에 있습니다.C 함수의 D 콜백

void lua_pushcfunction(lua_State* L, string name, lua_CFunction func); 

나는 그것이해야 않는 D2 기능을 밀어하려면 :

extern(C) alias int function(lua_State* L) lua_CFunction; 

루아는 또한 API 기능을 제공합니다 :

typedef int (*lua_CFunction) (lua_State *L); 

나는 동등한 D2 문이 될 것입니다 가정 extern (C) 또는 함수를 사용할 수 있습니까?

int dfunc(lua_State* L) 
{ 
    std.stdio.writeln("dfunc"); 
} 

extern(C) int cfunc(lua_State* L) 
{ 
    std.stdio.writeln("cfunc"); 
} 

lua_State* L = lua_newstate(); 
lua_pushcfunction(L, "cfunc", &cfunc); //This will definitely work. 
lua_pushcfunction(L, "dfunc", &dfunc); //Will this work? 

cfunc 만 사용할 수있는 이유는 무엇입니까? 나는 C++에서 그런 것을 할 필요가 없습니다. C++ 함수의 주소를 C에 전달하면 모든 것이 올바르게 작동합니다.

+0

현재 존재하지 않는 바인딩이 있습니다. 얼마나 좋은지 잘 모르겠습니다. http://code.google.com/p/dlua/ –

답변

8

예,이 함수는 extern (C)으로 선언되어야합니다.

C 및 D의 함수 호출 규칙이 다르므로 extern (C)과 함께 C 규칙을 사용하도록 컴파일러에 알려야합니다. 왜 C++에서 이것을 할 필요가 없는지 나는 모른다.

는 C.

또한 가치는 함수 인수를 선언하는 C 스타일을 사용할 수 있음을 주목할 것와 인터페이스에 대한 자세한 내용은 here를 참조하십시오.

+0

C 및 C++이 * 가까이있어 * 중요하지 않을 수도 있습니다. . –

+1

교육 된 추측으로, 나는 C++에 대해 함수 포인터로 전달 될 수있는 함수 (함수 포인터의 유형은 C에서 정의 할 수 있음)가 동일한 호출 규칙을 가질 것이라고 생각합니다. – BCS

1

예, typedef 번역이 정확합니다. OTOH 당신은 the htod tool을 보았습니까?