2013-05-14 85 views
0

我對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

+0

你的代碼編譯,我沒有任何問題(除了'init'功能錯過參數)。 – soon 2013-05-14 17:54:48

+0

@soon好的。 ; P – beakr 2013-05-14 18:41:03

回答

1

我猜你的Lua.h和Lua的Lua.h有衝突。考慮將你的文件重命名爲fabric.h或類似的東西。

也就是說,將非內聯函數放入頭文件將導致鏈接器錯誤,當文件包含到兩個翻譯單元中時。考慮將代碼拆分爲典型的頭部/實現對。

+1

你確定嗎?看起來像Lua的是.hpp,並且雙引號不應搜索尖括號到最後的位置。 – chris 2013-05-14 17:52:19

+0

@chris'lua.h'也存在。不知道引號是否會引起衝突,但... – beakr 2013-05-14 18:37:22

+0

@beakr,哦,我不使用它。我剛剛在你的帖子中看到了hpp。報價單應首先查找用戶標題,然後查找系統標題。所有的標準都表明,<>可以看起來是它想要的,而「」可以看起來是它想要的,但是如果找不到,就必須像<>那樣嘗試。 – chris 2013-05-14 19:19:21

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" 
} 
+0

Mac,從來沒有Windows。但我應該重新命名'Lua.h'。 – beakr 2013-05-14 18:36:15

相關問題