struct _LuaVariableRegistration{ template<class T> _LuaVariableRegistration(const char* lua_name,const T& c_name) { /* ... This code will be ran at startup; it temporarily saves lua_name and c_name in a std::map and when Lua is loaded it will register all temporarily global variables in Lua. */ }};
然而,每次想要注册Lua全局变量时手动实例化那个超级丑陋的类是很麻烦的;这就是我创建以下宏的原因:
#define LUA_GLOBAL(lua_name,c_name) static SNow::_LuaVariableRegistration _____LuaGlobal ## c_name (lua_name,c_name);
所以你要做的就是把它放在cpp文件的全局范围内,一切都很完美:
LUA_GLOBAL("LuaIsCool",true);
你去!现在在Lua LuaIsCool中将变量初始化为true!
但是,问题在于:
LUA_GLOBAL("ACCESS_NONE",Access::None);
哪个成了:
static SNow::_LuaVariableRegistration _____LuaGlobalAccess::None ("ACCESS_NONE",&Access::None);
:((
我需要在宏中连接c_name,否则它会抱怨两个具有相同名称的变量;我尝试用__liNE__替换它,但它实际上变成_____LuaGlobalAccess__liNE__(即它没有被替换).
那么,有没有办法以某种方式获得一个独特的字符串,或任何其他解决方法?
PS:是的我知道以_开头的名字是保留的;我仍然使用它们来达到这样的目的,即小心选择标准库极不可能使用的名称.另外,它们位于命名空间中.
解决方法 您需要添加额外的宏层以使预处理器做正确的事情:#define TOKENPASTE(x,y) x ## y#define TOKENPASTE2(x,y) TOKENPASTE(x,y)#define LUA_GLOBAL(lua_name,c_name) ... TOKENPASTE2(_luaGlobal,__liNE__) ...
有些编译器也支持__COUNTER__宏,每次计算时都会扩展为一个新的唯一整数,因此您可以使用它来代替__liNE__来生成唯一标识符.我不确定它是否是有效的ISO C,尽管gcc接受它与-ansi -pedantic选项一起使用.
总结以上是内存溢出为你收集整理的C预处理器元编程:获得唯一值?全部内容,希望文章能够帮你解决C预处理器元编程:获得唯一值?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)