加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:25:18 所属栏目:百科 来源:网络整理
导读:我正在利用C全局变量的构造函数的行为以简单的方式在启动时运行代码.这是一个非常简单的概念,但有点难以解释,所以让我只需粘贴代码: struct _LuaVariableRegistration{ templateclass T _LuaVariableRegistration(const char* lua_name,const T c_name) { /
我正在利用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__来生成唯一标识符.我不确定它是否是有效的ISO C,尽管gcc接受它与-ansi -pedantic选项一起使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读