Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::bind不能与lua_调用互操作_C++_C++11_Lua - Fatal编程技术网

C++ std::bind不能与lua_调用互操作

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); } #包括 外部

在使用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);
}
#包括
外部“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';
}