正如 OP 所提到的,lua_call
是一个宏,它会扩展为 lua_callk
,但这只是其中的一半真相。
lua_call
是一个函数宏:
github: lua.h
:
#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL)
这就是差别所在。
因此,lua_call
只有在使用正确数量的参数时才会扩展为lua_callk
。
我创建了一个MCVE来演示这一点:
#include <iostream>
#define lua_call(L, n, r) lua_callk(L, (n), (r))
void lua_callk(void *L, int n, int r)
{
std::cout << "lua_callk(" << L << ", " << n << ", " << r << ")\n";
}
#define TEST(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__
int main()
{
TEST(lua_call(nullptr, 2, 1));
}
输出:
g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
lua_call(nullptr, 2, 1);
lua_callk(0, 2, 1)
coliru上的实时演示
相比之下:
#include <iostream>
#define lua_call(L, n, r) lua_callk(L, (n), (r))
void lua_callk(void *L, int n, int r)
{
std::cout << "lua_callk(" << L << ", " << n << ", " << r << ")\n";
}
#define TEST(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__
int main()
{
TEST(lua_call(nullptr, 2, 1));
std::cout << "&lua_call: " << &lua_call << '\n');
}
输出:
main.cpp: In function 'int main()':
main.cpp:15:34: error: 'lua_call' was not declared in this scope
15 | std::cout << "&lua_call: " << &lua_call << '\n';
| ^~~~~~~~
在Coliru上查看实时演示
或者,为了更加明显:
#define lua_call(L, n, r) lua_callk(L, (n), (r))
void lua_callk(void *L, int n, int r)
{
std::cout << "lua_callk(" << L << ", " << n << ", " << r << ")\n";
}
#define TEST(...) std::cout << #__VA_ARGS__ << ";\n"; __VA_ARGS__
int main()
{
TEST(lua_call(nullptr, 2, 1));
std::cout << "&lua_call: " << &lua_call << '\n';
}
使用仅预处理器运行:
# 1 "main.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.cpp"
void lua_callk(void *L, int n, int r)
{
std::cout << "lua_callk(" << L << ", " << n << ", " << r << ")\n";
}
int main()
{
std::cout << "lua_call(nullptr, 2, 1)" << ";\n"; lua_callk(nullptr, (2), (1));
std::cout << "&lua_call: " << &lua_call << '\n';
}
点击此处查看在coliru上的演示
修复方法也很明显(如Rafix的评论中所提到的):
只需将lua_bind()
包装到可寻址的函数或lambda中即可。
lua_call
不是一个宏吗?它的定义是什么? - YSClua_callk
的调用。 - Peter[](lua_State* s){ lua_call(s,0,0); }
,或者传递指向Lua实际函数的指针,而不是宏定义:std::bind(lua_callk,_1,0,0,0,0)
。 - rafix07