[英]C++ Preprocessor metaprogramming: obtaining an unique value?
我正在利用C ++全局变量的构造函数的行为,以一种简单的方式在启动时运行代码。 这是一个非常简单的概念,但有点难以解释,所以让我粘贴一下代码:
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__
来生成唯一标识符。 尽管gcc接受它与-ansi -pedantic
选项一起使用,但我不确定它是否为有效的-ansi -pedantic
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.