Variablennamen generieren mit Macro und String Parameter



  • Hi,

    ist es möglich einen String an ein Macro zu übergeben und daraus einen Variablennamen zu generieren. Z. B.

    #define GET_RESOURCE_VARS(x) \
            extern const char _binary_##x##_start, _binary_##x##_end;
    
    int main()
    {
        std::string resource = "Resource.txt";
        GET_RESOURCE_VARS(resource);
        ....
        return 0;
    }
    

    Im Beispiel oben würden die Variable natürlich so aussehen:

    extern const char _binary_resource_start, _binary_resource_end;
    

    anstatt

    extern const char _binary_Resource_txt_start, _binary_Resource_txt_end;
    


  • Ich denke nicht, dass das so funktionieren kann. Dein string ist eine Variable, die vom Compiler zur Laufzeit "erstellt" wird. Makros werden vom Preprozessor vor der Compilation abgearbeitet.

    Du könntest sowas versuchen:

    int main()
    {
       #define string_resource "Resource.txt";
       GET_RESOURCE_VARS(string_resource);
        
        return 0;
    }
    

    Aber wofür brauchst du das? Mir fällt spontan dafür keine Anwendung ein (ok, ist Feitag, aber trotzdem),



  • Aber ohne die Anführungszeichen und abschließendes Komma (und mit _, da ein Punkt nicht in einem Variablenbezeichner auftauchen darf), also

    #define string_resource Resource_txt
    GET_RESOURCE_VARS(string_resource);
    

    @Enumerator: Genau, wofür benötigst du dies?
    Wenn du zur Laufzeit auf verschiedene Variablen zugreifen möchtest, dann lege am besten dafür eine std::map<std::string, T> an.



  • @Th69 sagte in Variablennamen generieren mit Macro und String Parameter:

    Aber ohne die Anführungszeichen und abschließendes Komma (und mit _, da ein Punkt nicht in einem Variablenbezeichner auftauchen darf), also

    #define string_resource Resource_txt
    GET_RESOURCE_VARS(string_resource);
    

    Hups, ich mache Macro spielereien so selten, hätte ich wohl mal vorher ausprobieren sollen 😅



  • Ich linke Resourcen wie Textdateien, Bilder usw. in die Executable bzw. Libs per "ld" und möchte da einen Mechanismus haben um zur Laufzeit auf die Resourcen zuzugreifen. Der Linker erzeugt Symbole wie z.B. "_binary_XXXX_start" über die man mittels extern zugreifen kann:

    extern const char _binary_resource_start, _binary_resource_end;
    

    Das funktioniert dann natürlich nur zur Compilezeit.


  • Mod

    Und wie kommt es, dass du zur Compilezeit nicht weißt, wie deine eincompilierten Ressourcen heißen?


Log in to reply