Ich nutze das Verhalten der Konstruktoren globaler C++-Variablen, um auf einfache Weise Code beim Start auszuführen. Es ist ein sehr einfaches Konzept, aber ein wenig schwierig zu erklären, so lassen Sie mich nur den Code einfügen:
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. */
}
};
Allerdings ist es mühsam, diese superhässliche Klasse jedes Mal manuell zu instanziieren, wenn man eine globale Lua-Variable registrieren will; deshalb habe ich das folgende Makro erstellt:
#define LUA_GLOBAL(lua_name, c_name) static Snow::_LuaVariableRegistration _____LuaGlobal ## c_name (lua_name, c_name);
Sie müssen das also nur in den globalen Bereich einer cpp-Datei setzen, und alles funktioniert perfekt:
LUA_GLOBAL("LuaIsCool", true);
Na also! Jetzt in Lua LuaIsCool
wird eine Variable sein, die mit true initialisiert wird!
Aber hier liegt das Problem:
LUA_GLOBAL("ACCESS_NONE", Access::None);
Das wird:
static Snow::_LuaVariableRegistration _____LuaGlobalAccess::None ("ACCESS_NONE", &Access::None);
:(( Ich muss verketten c_name
im Makro, sonst beschwert es sich über zwei Variablen mit demselben Namen; ich habe versucht, sie zu ersetzen durch __LINE__
aber es wird tatsächlich _____LuaGlobalAccess__LINE__
(d.h. er wird nicht ersetzt).
Gibt es also eine Möglichkeit, eine eindeutige Zeichenfolge zu erhalten, oder eine andere Abhilfe?
PS: Ja, ich weiß, dass Namen, die mit _ beginnen, reserviert sind; ich verwende sie trotzdem für Zwecke wie diesen, wobei ich darauf achte, Namen zu wählen, die die Standardbibliothek höchstwahrscheinlich nie verwenden wird. Außerdem befinden sie sich in einem Namensraum.