使用匿名函数正确定义名称空间

时间:2013-05-14 17:43:13

标签: c++ namespaces

我对C ++命名空间以及如何定义它们有点困惑。我有两个文件:Lua.hMain.cppLua.h包含以下用于在命名空间中运行Lua脚本的帮助程序:

#ifndef Lua_h
#define Lua_h

#include <lua.hpp>

namespace fabric
{
  namespace lua
  {
    void loadLibs(lua_State * L)
    {
      static const luaL_Reg luaLibs[] =
      {
        { "io", luaopen_io },
        { "base", luaopen_base },
        { NULL, NULL }
      };

      const luaL_Reg * lib = luaLibs;
      for (; lib->func != NULL; lib++)
      {
        lib->func(L);
        lua_settop(L, 0);
      }
    }

    void init(lua_State * L) 
    {
      loadLibs(L);
      luaL_dofile(L, "Init.lua");

      lua_close(L);
    }
  }
}

#endif

我的Main.cpp文件尝试使用这些辅助函数运行Lua脚本:

#include "Lua.h"

int main (int argc, char * argv[])
{
  fabric::lua::init();
  return 0;
}

但是当我尝试编译Main.cpp时,我得到了这个:

Source/Main.cpp:9:3: error: use of undeclared identifier 'fabric'
  fabric::lua::init();
  ^

我对如何定义此命名空间感到困惑。辅助函数的代码都很好,但Main.cpp找不到命名空间。任何人都可以给我一些关于如何在C ++中正确定义这个命名空间的指针吗?

修改

立即行动。出于某种原因,我的-I标志在编译时没有工作,因为我的标题在Include/下。我还将Lua.h重命名为LuaHelpers.h

2 个答案:

答案 0 :(得分:1)

我猜你的Lua.h和Lua的Lua.h之间存在冲突。考虑将文件重命名为fabric.h或类似的东西。

也就是说,当文件包含在两个翻译单元中时,将非内联函数放入头文件会导致链接器错误。考虑将代码拆分为典型的头/实现对。

答案 1 :(得分:1)

也许原因是,Lua库也有文件,而且你正在使用Windows,所以文件系统不区分大小写?

lua.hpp

// lua.hpp
// Lua header files for C++
// <<extern "C">> not supplied automatically because Lua also compiles as C++

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}