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.