defines in Strings



  • Wenn ich etwas wie
    #DEFINE FOO 1
    habe und dies in einem std::string verbraten will, geht das nur über nachträgliches hinzufügen oder?

    Es gibt keinen Weg, so etwas zu realisieren?
    std::string bar("Wert #FOO");
    Das das Beispiel nicht geht, ist mir klar, #FOO würde als String behandelt werden, aber kann man das irgendwie escapen?



  • Du musst das ganz genau gleich machen, als ob du das ne 1 hinzufügen möchtest. Sprich du musst das ganze zuerst in einen string umwandeln und dann kannst du das ganz normal, wie andere strings anfügen.



  • Hallo,

    du müsstest das wenn dann auch als string schreiben

    #define FOO "1"
    std::string bar(FOO);
    

    ... oder meinst du was anderes?

    Gruß Simon



  • Vielleicht meinst du auch sowas hier?

    #define FOO 1
    
    #define STRINGIFY(x) _STRINGIFY(x)
    #define _STRINGIFY(x) #x
    
    std::string bar("Wert " STRINGIFY(FOO));
    

    Das mit dem doppelten Makro ist schon irgendwie krank, geht aber wohl nicht anders...



  • [edit]unsinn[/edit]



  • dooooomi schrieb:

    Vielleicht meinst du auch sowas hier?

    #define FOO 1
    
    #define STRINGIFY(x) _STRINGIFY(x)
    #define _STRINGIFY(x) #x
    
    std::string bar("Wert " STRINGIFY(FOO));
    

    Das mit dem doppelten Makro ist schon irgendwie krank, geht aber wohl nicht anders...

    wieso sollte das nicht gehen?

    #define FOO 1
    
    #define STRINGIFY(x) #x
    
    std::string bar("Wert " STRINGYFY(FOO));
    

    funktioniert das etwa nicht?



  • daersc schrieb:

    wieso sollte das nicht gehen?

    #define FOO 1
    
    #define STRINGIFY(x) #x
    
    std::string bar("Wert " STRINGYFY(FOO));
    

    funktioniert das etwa nicht?

    Nein, das gibt nicht "1" aus sondern "FOO". Aber die Erklärung dafür überlasse ich lieber jemandem, der den Präprozessor besser versteht als ich...



  • template <class T>
    std::string STRINGIFY(T const& t)
    { return boost::lexical_cast<std::string>(t); }
    
    const int FOO = 1;
    
    std::string bar = std::string("Wert") + STRINGIFY(FOO);
    

    Warum immer nur Makros??



  • oder du benutzt stringstream

    #include <iostream>
    #include <string>
    #include <sstream>
    
    #define FOO 1
    
    template<class T> std::string convert(T const& t){
        std::stringstream ss;
        ss<<t;
        return ss.str();
    }
    
    int main {
        std::string bar = convert(FOO);
        cout<<bar<<endl;
    }
    
    EDIT: kann man das mim stringstream auch kürzer schreiben?
    


  • varginator schrieb:

    oder du benutzt stringstream

    [...]
    template<class T> std::string convert(T const& t){
        std::stringstream ss;
        ss<<t;
        return ss.str();
    }
    [...]
    EDIT: kann man das mim stringstream auch kürzer schreiben?
    

    Man kanns kürzer schreiben - boost::lexical_caststd::string macht fast genau das, mit der Ausnahme dass die stream-Repräsentation von t da keine Whitespaces haben darf.


Anmelden zum Antworten