Я использую поведение конструкторов глобальных переменных C++ для простого запуска кода при запуске. Это очень простая концепция, но немного трудно объяснить, так что позволь мне просто вставить код: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: Да, я знаю имена, начинающиеся с _, зарезервированы; Я использую их в любом случае для таких целей, чтобы быть осторожным, чтобы выбрать имена, которые стандартная библиотека вряд ли когда-либо будет использовать. Кроме того, они находятся в пространстве имен.
Примечание. Если идентификатор, начинающийся с подчеркивания, находится в пространстве имен, он зарезервирован только в том случае, если за ним следует заглавная буква. В противном случае вы можете использовать его. Поэтому измените биты «_Lua» на «_lua», и никто не может жаловаться. По крайней мере, о тех (имена, содержащие «_____», - это другая история). –
не уверен, что я понял, почему вы не соглашаетесь с 'lua_name' вместо' c_name'? Разве это не так, чтобы быть уникальным? – int3
в любом случае, я считаю, http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation/1489985#1489985 решает вашу проблему «правильной подстановки». – int3