C++ std::bind不能与lua_调用互操作
在使用Lua 5.3.5和gcc 9.2.0的开发库时,我遇到了以下最小代码段的奇怪编译问题:C++ std::bind不能与lua_调用互操作,c++,c++11,lua,C++,C++11,Lua,在使用Lua 5.3.5和gcc 9.2.0的开发库时,我遇到了以下最小代码段的奇怪编译问题: #include <functional> extern "C" { #include "lua.h" #include "lualib.h" } int main() { using namespace std::placeholders; auto lua_simple_call = std::bind(lua_call, _1, 0, 0); } #包括 外部
#include <functional>
extern "C" {
#include "lua.h"
#include "lualib.h"
}
int main()
{
using namespace std::placeholders;
auto lua_simple_call = std::bind(lua_call, _1, 0, 0);
}
#包括
外部“C”{
#包括“lua.h”
#包括“lualib.h”
}
int main()
{
使用名称空间std::占位符;
auto lua\u simple\u call=std::bind(lua\u call,_1,0,0);
}
gcc抱怨:
错误:“lua\u调用”未在此范围内声明
。当尝试在不使用std::bind
的情况下简单调用lua_call
时,不会出现此问题,对于其他lua C函数,如lua_newtable
等,似乎也不会出现此问题。我想知道是什么原因导致此问题,以及如何规避此问题。如OP所述,lua\u call
是一个宏,它扩展为lua\u callk
,但这只是事实的一半
lua\u调用
是一个函数宏:
这就不同了
因此,lua\u call
仅当与正确数量的参数一起使用时才会扩展到lua\u 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));
//TEST(std::cout << "&lua_call: " << &lua_call << '\n');
}
与:
#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');
}
#包括
#定义lua_调用(L,n,r)lua_调用(L,(n),(r))
void lua_callk(void*L,int n,int r)
{
std::cout不是lua_call
宏或其他什么?它的定义是什么?它是,但我不认为有什么问题,因为它只是扩展到调用lua_callk
。为了理解为什么不可能,你需要阅读更多关于预处理宏工作方式的内容。从这里开始:再深入一点。最终,你会找到一个s解决方法。你可以将它包装成lambda:[](lua_State*s){lua_call(s,0,0)}
或者将指针传递给lua的实函数,而不是宏:std::bind(lua_callk,_1,0,0,0,0)
。我现在觉得自己没有意识到这一点很愚蠢,但无论如何这是一个很好的解释!
#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');
}
//#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';
}