Variadic Makros mit 0 Argumenten in C99
Ich habe einige debugging-code, der wie folgt aussieht:
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void __my_error(const char*loc, const char *fmt, ...);
#define my_error(fmt, ...) __my_error(AT, fmt, ##__VA_ARGS__)
Den letzten makro verwendet wird, so kann ich das einfügen die Lage in der debug-Ausgabe, wo der Fehler aufgetreten ist. Allerdings, wenn ich rufen Sie die Funktion wie folgt:
my_error("Uh oh!");
Ich würde wie mein code C99, so finde ich, wenn dieses kompiliert, bekomme ich die folgende Fehlermeldung:
error: ISO C99 requires rest arguments to be used
Ich weiß, ich kann dies lösen, indem Sie ändern den Aufruf
my_error("Uh oh!", NULL);
Aber gibt es irgendeinen Weg, um diesen look weniger hässlich? Danke!
- Auch möchten Sie vielleicht einen Blick auf diese Antwort: stackoverflow.com/questions/1644868/... (das Einzige argument Abschnitt)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich zwei Lösungen für dieses problem. (Drei, wenn Sie zählen 'stick mit gcc').
Extra Sonderfall makro
Fügen Sie ein neues makro für wenn Sie möchten, drucken Sie eine Feste Zeichenfolge.
Pro: Minimale Menge von zusätzlichen code.
Con: Es ist einfach das falsche makro (aber mindestens Sie bemerken dies zur compile-Zeit).
Setzen
fmt
im '...'Vararg-Makros können nur __VA_ARGS__ als parameter hat (im Gegensatz zu vararg-Funktionen). So können Sie die
fmt
argument innerhalb der __VA_ARGS__ und ändern Sie Ihre Funktion.Pro: Eine syntax - /makro für alle Fehlermeldungen.
Con: Erfordert das umschreiben von Ihrem
__my_error
Funktion, die möglicherweise nicht möglich sein.__my_error
Funktion sollte nie direkt aufgerufen werden)?my_error_real
,my_error_private
oder nurmy_error_x
(aus 'erweitert').