Frage

eine Kompilierung-Konstante ganze Zahl Given (ein Objekt, keinen Makro), kann ich es mit einem Stringliteral bei der Kompilierung kombinieren, möglicherweise mit dem Prä-Prozessor?

Zum Beispiel kann ich Stringliterale verketten nur durch sie benachbart zueinander platzieren:

bool do_stuff(std::string s);
//...
do_stuff("This error code is ridiculously long so I am going to split it onto "
         "two lines!");

Great! Aber was, wenn ich hinzufügen ganzzahlige Konstanten in der Mischung:

const unsigned int BAD_EOF = 1;
const unsigned int BAD_FORMAT = 2;
const unsigned int FILE_END = 3;

Ist es möglich, den Prä-Prozessor zu verwenden, um irgendwie diese Literale mit der String verketten?

do_stuff("My error code is #" BAD_EOF "! I encountered an unexpected EOF!\n"
         "This error code is ridiculously long so I am going to split it onto "
         "three lines!");

Wenn das nicht möglich ist, kann ich konstante Strings mit Stringliterale mische? D. h wenn meine Fehlercodes sind Strings statt unsigneds?

Und wenn weder möglich ist, was ist der kürzeste, sauberste Weg zusammen, um diese Mischung aus Stringliterale und Codes numerischen Fehler zu patchen?

War es hilfreich?

Lösung

Wenn BAD_EOF ist ein Makro, könnten Sie stringize es:

#define STRINGIZE_DETAIL_(v) #v
#define STRINGIZE(v) STRINGIZE_DETAIL_(v)

"My error code is #" STRINGIZE(BAD_EOF) "!"

Aber es ist nicht (und das ist nur über immer eine gute Sache), so müssen Sie auf Format String :

stringf("My error code is #%d!", BAD_EOF)

stringstream ss; ss << "My error code is #" << BAD_EOF << "!";
ss.str()

Wenn dies war ein großes Problem für Sie (es soll nicht sein, auf jeden Fall zunächst nicht), verwenden Sie eine separate, spezialisierte Zeichenfolge für jede Konstante:

unsigned const BAD_EOF = 1;
#define BAD_EOF_STR "1"

Dies hat alle Nachteile eines Makros und mehr auf screwup halten für ein klein wenig Leistung, die wahrscheinlich wird für die meisten Anwendungen keine Rolle . Wenn Sie jedoch auf dieser Trade-off entscheiden, hat es ein Makro sein, weil der Präprozessor nicht zugreifen können Werte auch wenn sie konst.

Andere Tipps

Was ist los mit:

do_stuff(my_int_1,
     my_int_2,
     "My error code is #1 ! I encountered an unexpected EOF!\n"
     "This error code is ridiculously long so I am going to split it onto "
     "three lines!");

Wenn Sie die Fehlercodes zu abstrahieren wollen, dann können Sie dies tun:

#define BAD_EOF "1"

Dann können Sie BAD_EOF verwenden, als ob es sich um eine Stringliteral waren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top