Über-und Rückgabe die Ausgabe in C-makro
Ich versuche instrument code zu fangen und zu drucken Fehlermeldungen. Derzeit bin ich mit einem makro somethng wie diese:
#define my_function(x) \
switch(function(x)) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
}
Ich normalerweise nie erfassen die Funktion Ausgabe und dies funktioniert gut. Aber ich habe ein paar Fälle, wo ich auch brauchen, der return-Wert function()
. Ich habe versucht, so etwas wie die folgenden, aber diese produziert einen syntax-Fehler.
#define my_function(x) \
do { \
int __err = function(x); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
__err; \
} while(0)
Ich könnte, deklarieren Sie eine Globale variable, um den Rückgabewert der Funktion, aber das sieht häßlich aus und mein Programm ist multithreaded, so dass ' s wahrscheinlich, Probleme zu verursachen. Ich hoffe, es gibt eine bessere Lösung gibt.
Warum gehst du nicht machen es eine inline-Funktion?
Der "output" einer Funktion ist nicht das gleiche wie der "Rückgabewert" einer Funktion. Sie wollen den return-Wert.
Dein post ist fehlen einige Zeilen, Fortsetzung Marker. Mag sein dass Sie Ihre syntax-Fehler.
Der "output" einer Funktion ist nicht das gleiche wie der "Rückgabewert" einer Funktion. Sie wollen den return-Wert.
Dein post ist fehlen einige Zeilen, Fortsetzung Marker. Mag sein dass Sie Ihre syntax-Fehler.
InformationsquelleAutor Michael Mior | 2010-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist relativ komplizierten code, es gibt nicht viel Grund zu haben, es in ein makro. Machen Sie es
inline
(C99) oderstatic
(C89) oder beide, wenn Sie wirklich wollen, um es in eine header-Datei. Mit jedem vernünftigen compiler diese sollten dann in der Folge in die gleiche Effizienz wie ein makro.FOO ## _size
vom generierten code, den ich verwende, zum Beispiel). Ansonsten, ja, bitte verwenden Sie inline-Funktionen.Eine andere nützliche Sache, die inline-Funktion kann nicht erweitert
__FILE__
und__LINE__
makro zum generieren Fehlermeldung, wo Fehler tatsächlich passiert ist. Plus, ich persönlich finde Antworten den Leuten zu erzählen, nicht um die Dinge, die Sie gefragt, ein Weg, für wenig hilfreich, da Sie nicht wirklich eine Antwort auf die Frage. Wenn Sie eine Frage beantworten, die Frage zu beantworten. Alle Kommentare auf die Frage sollte nur kommen, nachdem die Frage beantwortet ist, oder einfach nur ein Kommentar.Ich denke, Sie sind fehlt den Punkt. Die Frage ist, gibt einen Wert zurück, aus solchen Konstrukten. Dies ist ein feature, das Sie nicht haben, können mit Makros alleine in standard-C., Aber nichts hindert Sie, wickeln Sie ein makro ungefähr solch eine Funktion zu, die sich auch mit
__LINE__
etcWenn Sie wickeln Sie ein makro um die Funktion, gehen Sie nicht zurück auf das ursprüngliche problem, wo man nicht zurückkehren kann Wert aus dem makro-Ausdruck? Der einzige Weg, ich sehe das mit der inline-Funktion übergeben wird
__LINE__
als argument für die inline-Funktion, die Ergebnisse in etwas hässlich code IMHO.tun Sie dies direkt in der call wäre in der Tat hässlich, ja. Deshalb möchte ich wickeln wie ein Aufruf in einem makro fügt hinzu, dass
__LINE__
,__FILE__
oder__func__
. Dies wäre völlig portable, typsicher und effizient. Und bitte Euch alle die stimmberechtigten diese nach unten, gehen Sie zurück zu der Frage, die hier beantwortet werden. Es gibt nichts über diese spezielle Makros in der Frage.InformationsquelleAutor Jens Gustedt
GCC hat eine Funktion namens Aussage Ausdrücken
Also, wenn define-makro wie
dass Sie in der Lage zu verwenden wie wie
InformationsquelleAutor qrdl
Sehr späte Antwort. Aber nicht weniger. Ich Stimme zu inline-Funktionen sind besser geworden, aber Makros bieten einige ziemlich das drucken Spaß, den Sie nicht bekommen kann mit inline-Funktionen. Ich Stimme mit @qrdl, dass Sie tatsächlich use-Anweisung Ausdrücke hatte Sie umstrukturiert deine Aussagen ein bisschen. Hier ist, wie es funktionieren würde mit einem makro -
({ ... })
Arbeit in einem compiler ? ist ein GNU-C Erweiterung gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.htmlist das nicht die do-while-nutzlos hier?
InformationsquelleAutor linuxmonk
Sorry, das ist ein edit...
Etwa so:
Zur Erhaltung der pass-by-reference C-Paradigma, sollten Sie rufen my_function diese Weise:
Diese Weise später, wenn Sie sich entscheiden, um my_function eine echte Funktion, die Sie nicht benötigen, ändern Sie den Aufruf von verweisen.
Btw, qrdl "- Anweisung Ausdrücken" ist auch ein guter Weg, es zu tun.
InformationsquelleAutor hopia
gibt es keine Notwendigkeit zu erklären, Variablen, wenn die Funktion ist wieder etwas, dann kannst du direkt den Wert. Zum Beispiel:
Hier do_something gibt einige integer. Dann können Sie ganz einfach verwenden Sie es wie:
do_something
und der einzige Weg, um die Methode, die Sie ' re darauf hindeutet, ist zu nennendo_something
zweimal.InformationsquelleAutor The joker