Ich hatte ein Problem – ich muss einen Makrowert sowohl als Zeichenfolge als auch als Ganzzahl verwenden.
#define RECORDS_PER_PAGE 10
/*... */
#define REQUEST_RECORDS \
"SELECT Fields FROM Table WHERE Conditions" \
" OFFSET %d * " #RECORDS_PER_PAGE \
" LIMIT " #RECORDS_PER_PAGE ";"
char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN];
/* ...and some more uses of RECORDS_PER_PAGE, elsewhere... */
Dies schlägt mit einer Meldung über “stray #” fehl, und selbst wenn es funktionieren würde, würde ich wohl die Makronamen als Zeichenfolgen erhalten, nicht die Werte. Natürlich kann ich die Werte der endgültigen Methode zuführen ( "LIMIT %d ", page*RECORDS_PER_PAGE ), aber es ist weder hübsch noch effizient. In Zeiten wie diesen wünschte ich mir, der Präprozessor würde Strings nicht besonders behandeln und ihren Inhalt wie normalen Code verarbeiten. Fürs Erste habe ich es mit verwechselt #define RECORDS_PER_PAGE_TXT "10" aber verständlicherweise bin ich nicht glücklich darüber.
Ich würde die nochmal überdenken "%d" dort zugunsten einer Abfragevariablen nur nach allgemeinen Grundsätzen. "%d" Es ist unwahrscheinlich, dass es anfällig für Injektionsangriffe ist, aber es scheint eine schlechte Angewohnheit zu sein, sich darauf einzulassen.
– Allmächtig
10. September 2018 um 13:30 Uhr
Das xstr Das unten definierte Makro wird nach der Makroerweiterung stringifiziert.
Ist dies eine neuere Anforderung? Ich kann mich nicht erinnern, dass solche Tricks das letzte Mal erforderlich waren, als ich Stringification verwendete …
Dieses Zitat aus dem Dokument hat es mir erklärt: “There is no way to combine an argument with surrounding text and stringize it all together. Instead, you can write a series of adjacent string constants and stringized arguments.“
– Viktor Sergijenko
12. Dezember 2017 um 16:17 Uhr
@VictorSergienko: Das ist nichts Neues und nichts Schädliches – String-Literal-Verkettung, char* abc = "A" "B" "C"; ist in jeder Hinsicht gleichwertig char* abc = "ABC"; Der Trick hier ist, wie man das besaitete Äquivalent erhält, "B" Anstatt von 'B' oder B.
Für mich auf gcc korrekt vorverarbeitet.
– kennytm
16. April 2010 um 13:29 Uhr
Beispiel zum Linux-Kernel: lxr.free-electrons.com/source/include/linux/stringify.h?v=4.7
– Ciro Santilli OurBigBook.com
3. November 2016 um 17:10 Uhr
Ich würde die nochmal überdenken
"%d"
dort zugunsten einer Abfragevariablen nur nach allgemeinen Grundsätzen."%d"
Es ist unwahrscheinlich, dass es anfällig für Injektionsangriffe ist, aber es scheint eine schlechte Angewohnheit zu sein, sich darauf einzulassen.– Allmächtig
10. September 2018 um 13:30 Uhr