2014-11-25 6 views
5

Ich habe eine Funktion, die einen ganzzahligen Wert zurückgibt. Jetzt möchte ich ein Makro schreiben, das diese Funktion aufruft, den Rückgabewert erhält und ihm eine Zeichenkette voranstellt und die resultierende Zeichenkette zurückgibt.Makro in C, um eine Funktion aufzurufen, die Ganzzahl zurückgibt und dann eine Zeichenfolge zurückgibt

Ich habe dies versucht:

#define TEST(x)  is_enabled(x) 

Ich nenne das Makro in der Hauptfunktion als:

int ret = 0; 
ret = TEST(2); 
printf("PORT-%d\n", ret); 

Dieses perfekt funktioniert. Ich möchte jedoch, dass das Makro die Zeichenfolge PORT-x zurückgibt, wobei x der Rückgabewert der aufgerufenen Funktion ist. Wie kann ich das machen?

EDIT:

Ich habe auch versucht, es in mehrere Zeilen zu schreiben wie:

#define TEST(x)\ 
{\ 
    is_enabled(x);\ 
} 

und nannte es in der Hauptfunktion als:

printf("PORT-%d\n", TEST(2)); 

Aber das gibt einen Compiler Zeitfehler:

error: expected expression before â{â token 
+0

Es kann getan werden, indem man ein Makro schreibt, das "sprintf" aufruft, aber Sie müssen einen Puffer zuweisen und es diesem Makro übergeben. Die Frage ist, warum willst du damit beginnen? Weil es sich anfühlt, als ob du etwas auf die falsche Art lösen willst. –

+0

Warum kannst du 'strcat' nicht benutzen? Warum wird ein Makro benötigt? – Gopi

+0

Sie sollten auf jeden Fall eine Funktion für diese schreiben ... – Antzi

Antwort

5

Verwenden Sie eine Funktion, kein Makro. Es gibt keinen guten Grund, ein Makro hier zu verwenden.

Sie können es lösen, indem Sie sprintf(3) in Verbindung mit malloc oder einem Puffer verwenden. Details finden Sie unter Creating C formatted strings (not printing them) oder man-Seiten.

Über Ihre edit: Sie brauchen keine Klammern verwenden {} in einem Makro, und sie verursachen Ihre Fehler als Vorverarbeitung es so etwas wie

printf("format%d", { 
    is_enabled(x); 
}); 

Um besser übersetzen würde zu verstehen, Makros ausführen gcc oder klingeln mit -E Flagge, oder versuchen Sie, diesen Artikel zu lesen: http://en.wikipedia.org/wiki/C_preprocessor

+0

Schließlich habe ich dies in einer Funktion implementiert, anstatt ein Makro zu schreiben. – iqstatic

2

Das ist ein bisschen ein Schmerz, da Sie sicherstellen müssen, gibt es Speicherplatz für die Zeichenfolge. Ehrlich gesagt, könnten Makros heutzutage nur für die bedingte Kompilierung reserviert werden.

Konstanten besser mit Aufzählungstypen getan, und Makro-Funktionen sind in der Regel besser als Inline-Funktionen (mit dem Wissen, dass inline ein Vorschlag ist an den Compiler, kein Bedarf).

Wenn Sie darauf bestehen, ein Makro zu verwenden, könnte der Speicher mit statischem Speicher erstellt werden, obwohl Probleme mit Threads auftreten, wenn Sie sie verwenden, und die zurückgegebene Zeichenfolge verzögert/mehrfach verwendet wird.

Sie können die Zeichenfolge auch dynamisch zuweisen, müssen sie jedoch nach Abschluss freigeben und Bedingungen mit zu wenig Arbeitsspeicher verarbeiten.

Vielleicht ist die einfachste Art und Weise ist das Makro Anwender stellen ihre eigene Lagerung, nach dem Vorbild der fordern:

#include <stdio.h> 

#define TEST2_STR(b,p) (sprintf(b,"PORT-%d",p),b) 

int main (void) { 
    char buff[20]; 
    puts (TEST2_STR(buff, 42)); 

    return 0; 
} 

die Ausgänge:

PORT-42 

Im Fall scheint das Makro ein wenig verwirrend, es nutzt den Komma-Operator, in dem der Ausdruck (a, b) sowohl a als auch b auswertet, und hat ein Ergebnis von b.

In diesem Fall wertet es die sprintf aus (die den Puffer füllt) und "gibt" dann den Puffer zurück. Und selbst wenn Sie denken Sie haben, dass noch nie zuvor gesehen, sind Sie wahrscheinlich falsch:

for (i = 0, j = 9; i < 10; i++, j--) 
    xyzzy[i] = plugh[j]; 

Trotz die meisten Leute denken, das ist ein Merkmal von for, es ist sehr viel ein anderes Konstrukt, das verwendet werden kann, in viele verschiedene Orte:

int i, j, k; 
i = 7, j = 4, k = 42; 

while (puts("Hello, world"),sleep(1),1); 

(und so weiter).

Verwandte Themen