繁体   English   中英

C ++预处理程序元编程:获得唯一值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM