gpt4 book ai didi

C++ 预处理器元编程 : obtaining an unique value?

转载 作者:太空狗 更新时间:2023-10-29 20:19:13 32 4
gpt4 key购买 nike

我正在利用 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 全局变量时手动实例化那个 super 丑陋的类是很麻烦的;这就是我创建以下宏的原因:

#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++ 预处理器元编程 : obtaining an unique value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1781137/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com