2015-12-24 3 views
14

Ich lese ein Buch über C, und irgendwo in den Autoren Code fand ich eine Definition eines Funktionsprototyps, dann ein Makro mit dem gleichen Namen, und es gibt keine Definition der Funktion selbst weder in .h oder .c Datei .Warum einen Funktionsprototyp definieren, dann Präprozessor-Makro mit dem gleichen Namen?

Ich meine etwas wie folgt aus:

int print_my_stufff(char *stuff); 
#define print_my_stuff(A) (printf("%s\n", A)) 
/* and print-my-stuff() function never defined anywhere else */ 

Der Code funktioniert, aber ich bekomme es einfach nicht, warum er einen Funktionsprototyp in erster Linie benötigt? Konnte er nicht einfach ein Makro schreiben? Was ist der Punkt? Ist es ein Compiler zu sagen, dass ein Makro zu einem Ausdruck ausgewertet werden sollte, der int zurückgibt oder was? Das Entfernen des Prototyps scheint ein Verhalten nicht zu ändern. Der Autor hat das nicht erklärt.

+0

Vielleicht ist es das Makro zu dokumentieren. Insbesondere die Rückgabetyp und Parametertypen. Der Autor tut das vielleicht nur für das Buch oder der Autor mag sogar denken, dass das eine gute Praxis im Allgemeinen ist. – kaylum

+0

habe ich noch nie in der Praxis eingesetzt gesehen, so kann ich nur raten: Vielleicht ist der Prototyp für die Dokumentation der Parametertypen des Makros? –

+1

@ kaylum Dann schreibe doch einfach einen Kommentar? '// dieses Makro tut foo' – Arc676

Antwort

8

Dies ist eine veraltete Praxis, von vor inline Funktionen. Wenn Sie die Funktion wie in print_my_stuff("hello") aufrufen, wird der Präprozessor die Aufrufsyntax sehen und den Inhalt des Makros einfügen. Wenn Sie den Namen anders als in f_ptr = &print_my_stuff verwenden, wird der Compiler die tatsächliche Funktion verwenden.

Der Aufruf der Funktion als (print_my_stuff)("hello") wird auch das Makro umgehen. Einige paranoide Stil-Guides erfordern sogar die Klammerung bestimmter Funktionsnamen, da Macros Evil sind.

+0

Im ersten Fall, welche Adresse wird es verwenden? Die Funktion hat keinen Körper –

+0

@ AndréFratelli Welcher Fall ist der erste Fall? Es sieht nie eine Funktion, wenn das Makro verwendet wird. – Potatoswatter

+0

Hier 'Wenn Sie den Namen anders verwenden, wie in f_ptr = & print_my_stuff, wird der Compiler die eigentliche Funktion verwenden. Die Adresse wird vergeben, aber welche Adresse? –

Verwandte Themen