2010-11-10 5 views
7

Ich erinnere mich, vorher gelesen zu haben über die Signifikanz (oder das Fehlen davon) zwischen dem Einschließen eines Parameternamens in einer Funktionsdeklaration und nicht einschließlich eines. Aber ich kann mich nicht erinnern, was ich gelesen habe oder wo ich es gelesen habe.Was ist der Unterschied zwischen der Angabe eines Parameternamens in einer Funktionsdeklaration und ohne einen?

zum Beispiel

void do_something(int *); // No parameter name included, only type. 

vs ...

void do_something(int * i); // type AND parameter name included. 

Also, was ist der Unterschied zwischen diesen beiden Erklärungen? Danke, dass Sie diese möglicherweise unbedeutende Frage gelesen und vielleicht beantwortet haben.

- UPDATE -

Okay, also das, was ich hatte, war von einem alten Professor von mir Warnung eine Reihe von Stilrichtlinien liest einen Parameternamen in Funktionsdefinition gegen einschließlich und NICHT den Parameter in der Funktion .

void do_something(int * i) { //code that doesn't use i;} //BAD 
void do_something(int *) { //code that doesn't use i;} //OK 

Antwort

12

Es gibt keinen Unterschied, soweit der Compiler betroffen ist.

Sinnvolle Parameternamen hinzufügen ist jedoch eine hilfreiche Form der Dokumentation.

1

Der Unterschied ist, dass die zweite Version besser lesbar ist, wenn Sie einen guten Parameternamen wählen. Nichts mehr zu sagen ;-)

0

In einer Forward-Deklaration sollte es keinen Unterschied geben. Sie werden beide das gleiche Speicherlayout für den Anruf beschreiben, daher sollten sie vollständig austauschbar sein.

1

Es gibt keinen technischen Unterschied zwischen diesen Deklarationen. Wenn Sie stattdessen

oder etwas ähnlich Beschreibendes hätten, wäre es eine Verbesserung in der Selbstdokumentation.

0

Für eine Vorwärtsdeklaration macht es keinen Unterschied.

In der aktuellen Definition wird ein Parameter ohne Namen nicht auf Verwendung geprüft. Es ist eine Möglichkeit, unbenutzte Parameter ohne ein Makro von UNUSED_PARAM (x) oder andere Tricks zu verwenden, deren einziger Zweck es ist, den Compiler darüber zu sperren.

+0

Makros sind eine Art Böses, was mit Namenskollisionen, Mehrfachauswertungen von Argumenten usw. Manchmal sind sie praktisch notwendig, aber es ist eine gute Idee, sie im Allgemeinen zu vermeiden. Verwenden Sie also besser die Funktionsvorlage 'unusedParam'. Das heißt, wenn Sie nicht mit den Warnungen leben können. Prost, –

+0

Einverstanden, Makros sind böse. Aber IMO, irgendein Code, der nur existiert, um zu sagen "Ja, ich mache nichts mit diesem Argument. Halt die Klappe, du dummer Compiler!" ist nicht viel besser. – cHao

+0

Aus diesem Grund existiert die Syntax '(void) argName;'. Das sagt dem Compiler, dass "argName" "verwendet" ist, obwohl es zu einem No-Op ausgewertet wird. –