Lassen Sie das Makro einen Wert zurückgeben
Bin ich mit einem makro und ich denke, es funktioniert gut -
#define CStrNullLastNL(str) {char* nl=strrchr(str,'\n'); if(nl){*nl=0;}}
So funktioniert es auf null aus den letzten Zeilenumbruch in einem string, kann wirklich sein verwendet, um abhacken der Zeilenumbruch, wenn es Links auf die von fgets.
So, ich wundere mich, wenn ich kann "return" einen Wert aus dem makro, so kann es genannt werden wie
func( CStrNullLastNL( cstr ) ) ;
Oder muss ich eine Funktion schreiben, die
Kommentar zu dem Problem
Sie müssen nicht schreiben-nur mit
strtok(str, "\n")
. Es ist zwar nicht das, was strtok()
wurde wirklich entwickelt, es macht den job perfekt (in der Tat, es ist eine der wenigen guten Anwendungen für strtok()
). In C++ sollten Sie nur verwenden Sie std::getline()
statt fgets()
, wenn. Was wollen Sie es zurück?
@Jerry Sarg: Wäre das nicht, ersetzen Sie die ERSTE newline statt der Letzte?
@Fred:
fgets
liest nur eine Zeile, also der erste ist auch der Letzte (und immer das Letzte Zeichen in der Zeichenfolge, wenn es vorhanden ist). Wenn Sie in einigen völlig anderen situation, wo man vielleicht mehr als einen haben, dann ja, es würde aufhören, und bei der ersten. Wenn Sie wissen, die
\n
ist entweder das Letzte Zeichen der Zeichenfolge ist oder nicht vorhanden ist, dann brauchen Sie nicht, etwas schicker als strlen()
. InformationsquelleAutor der Frage bobobobo | 2010-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für ein makro "einen Wert zurückgeben", wird das makro selbst ist ein Ausdruck. Dein makro ist ein Anweisungsblock, der nicht bewerten kann, zum Ausdruck.
Du solltest wirklich zum schreiben eines
inline
Funktion. Es wird genauso schnell und weitaus wartungsfreundlicher.InformationsquelleAutor der Antwort Mike DeSimone
funktionieren sollte.
Edit: ... im GCC.
InformationsquelleAutor der Antwort Danvil
Makro nicht, die Werte zurückgeben. Makros sagen, den Präprozessor zu ersetzen, was nach der
#define
mit dem, was ist, nachdem die Sache nach der#define
. Das Ergebnis ist gültiges C++.Was Sie für Fragen wie die folgenden stellen gilt:
Ich kann nicht denken, ein guter Weg, um zu verwandeln, in etwas, das gültig ist, andere als nur so eine echte Funktion. In diesem Fall bin ich mir nicht sicher, warum ein makro wäre besser als eine inline-Funktion. Das scheint das zu sein, was Sie wirklich wollen.
InformationsquelleAutor der Antwort i_am_jorf
Können Sie mit dem Komma-operator? Vereinfachtes Beispiel:
Hier B=SomeMacro(A) "gibt" das Ergebnis Permutiert(A) und weist ihn auf "B".
InformationsquelleAutor der Antwort Adisak
Wenn Sie wirklich wollen, dies zu tun, erhalten Sie einen compiler unterstützt C++0x-Stil lambdas:
Obwohl seit
CStrNullLastNL
ist im Grunde eine Funktion, die Sie sollte wohl umschreiben, dass es wie eine Funktion.InformationsquelleAutor der Antwort MSN
Ich gab +1 auf Mike, weil er 100% Recht, aber wenn Sie implementieren möchten, dieses als ein makro,
InformationsquelleAutor der Antwort Potatoswatter
Gibt einen Wert zurück, ist das, was inline-Funktionen sind. Und ganz oft, sagte inline-Funktionen sind besser geeignet, die Aufgaben als Makros, die sind sehr gefährlich und haben keinen Typ safetly.
InformationsquelleAutor der Antwort Michael Dorgan
Wenn Sie nicht über eine strenge Anforderung zu verwenden, nur makro, die Sie tun können, so etwas wie dieses (real-life-Beispiel):
Und dann verwenden Sie es in Ihrem code wie folgt:
InformationsquelleAutor der Antwort gatis paeglis