2014-01-10 6 views
5

ich einige Code einer Bibliothek lese ich verwende, und ich fand, dass dies in einer Funktion verwendet wurde:Grund hinter der Verwendung von (void) someInt; in Code

void someFunction(Foo& a, int index, int partId) 
{ 
    (void) partId; 
    (void) index; 
    // more code 
} 

Jeder weiß, warum? Vielen Dank.

+2

'partId' und' index' wurden nicht verwendet und dies ist eine Möglichkeit, sie auszuwerten, um Warnungen bezüglich nicht verwendeter Parameter zu umgehen. –

+1

Jemand weiß nicht zu schreiben "void someFunction (Foo & a, int, int)", die die Warnungen "unbenutztes Argument" vermeiden würde, die die '(void) partId' Anweisungen vermeiden. –

+0

@ JonathanLeffler: Oder die wohltätigere Erklärung ist, dass der Entwickler weiß, was sie sind und dass sie Platzhalter für die zukünftige Entwicklung des Codes sind. – Clifford

Antwort

9

Um eine Compiler-Warnung/einen Fehler zu vermeiden, der angibt, dass die Variable im Funktionskörper nicht verwendet wurde. Es ist eine Art Wahl, die andere Art und Weise die gleiche Wirkung erzielen würde die Variable un-named zu verlassen sein:

void someFunction(Foo& a, int /*index*/, int /*partId*/) 
+0

So mache ich es auch. Ich denke, es ist sauberer. Irgendein Grund, nicht so zu sein? –

+0

Nur stilistisch - die (void) -Methode basiert auf der Tatsache, dass sie keine Anweisungen erzeugt, aber es scheint mir, dass jemand ein Objekt tatsächlich so konstruieren könnte, dass es Nebenwirkungen hat und so tatsächlich einen Aufruf an einen Operator ausgibt, aber Ich habe nicht versucht, das zu beweisen :) – kfsone

+3

@KitFisto: Die Version, die eine Umwandlung verwendet, arbeitet in C. Das Auslassen des Namens auf dem Parameter funktioniert nur in C++. –

0

Was sie tut, ist zu VerwendungpartId und index, ohne sie tatsächlich zu verwenden. Mit anderen Worten, es täuscht den Compiler zu denken, dass die Funktionsargumente tatsächlich verwendet werden, während der Code sie in Wirklichkeit nicht verwendet.

Warum sollte man das tun? Weil sie im Compiler ein Flag gesetzt haben, um eine Warnung zu erzeugen, wenn ein Argument einer Funktion nicht in seinem Body verwendet wird.

Beachten Sie, dass Sie in C++ einfach den Argumentnamen aus der Funktion entfernen können. Wenn Sie das in C sehen, versuchen Sie, die Warnung für nicht verwendete Funktionsargumente zu deaktivieren, da Sie Argumentnamen nicht auslassen können.

+1

Und warum ist das Setzen dieser Flagge genau falsch? Stellen Sie sich vor Funktion void foo (int x, int y); Du bist müde und schreibst x statt y in den Körper, y wird unbenutzt. Die Warnung gibt Ihnen ein kostenloses Debuggen. Dies ist kein "schlechtes Compiler-Flag", dies ist ein "gutes Compiler-Flag". – Pluc

+0

@ThePluc, stellen Sie sich einen Callback vor, der einer Funktion übergeben wird, die ein Argument "void * extra" verwendet, das Sie nicht verwenden möchten. Es macht jedoch Sinn, den Namen des Arguments klar zu halten, was das Argument war. Zugegebenermaßen bin ich es gewohnt, dass C einen Fehler gibt, wenn Sie einen Parameternamen weglassen. – Shahbaz

+0

Ich habe nicht gesagt, dass es die bevorzugte Lösung ist, ich benutze das nie. Aber es ist sicherlich nicht besser, die Warnung zu deaktivieren. Ich persönlich kommentieren die Parameter Namen oder verwenden eine Compiler-spezifische Option wie __attribute __ ((unbenutzt)) für gcc (und CLang nehme ich an) – Pluc

3

Dies geschieht normalerweise, wenn die Parameter nicht in der Funktion verwendet werden und der Compiler eine Warnung über nicht verwendete Parameter ausgibt. Wenn der Fall hinzugefügt wird, wird der Compiler annehmen, dass sie verwendet wurden, und das Waring nicht ausgeben.

können Sie die gleiche Sache aus der Funktion meint nur erreichen den Namen des Parameters zu entfernen:

void someFunction(Foo& a, int, int) 
{ 
} 
+0

Aus meiner Erfahrung schafft das Entfernen des Namens aus der Funktion viel Verwirrung später, als die vorherige Absicht der Parameter ist verloren, und Sie müssen viel schwieriger arbeiten, um zu verstehen, wofür es in erster Linie bestimmt war ... – user1708860

+0

@ user1708860 - Ich stimme zu, ich habe es nur hier zur Veranschaulichung gesetzt. Dies ist kein Problem in einer Methode, da die Deklaration in der Klasse alle Parameter enthält, aber die Implementierung kann sie weglassen, wenn sie nicht benötigt werden. – Sean

+0

Der übliche Grund für den unbenannten Parameter liegt darin, dass die Funktion einer Schnittstelle entspricht, die 3 Parameter benötigt, aber diese bestimmte Implementierung der Schnittstelle verwendet nicht die Informationen aus zwei der Parameter. Rückrufe und verwandte Konzepte. –

1

Index und partId werden innerhalb der Funktion nicht verwendet.

Ein C/C++ - Compiler wird normalerweise eine Warnung über nicht verwendete Parameter ausgeben.

Die (void) parameter; Anweisung generiert keinen Code, aber der Compiler weiß, dass Sie den Parameter verwenden, um die Warnung zu vermeiden. Es ist auch eine höfliche Art, einen anderen Programmierer leicht wissen zu lassen, dass die Parameter aus irgendeinem Grund nicht verwendet werden
(in der Regel die Einhaltung einer allgemeineren Schnittstelle oder die Unterstützung veralteter Parameter von einer früheren Version der gleichen Schnittstelle).

Last but not least, wie Jerry Coffin darauf hingewiesen hat, funktioniert dies sowohl in C als auch in C++, während die alternative Lösung, unbenannte Parameter zu verwenden, nur in C++ funktioniert.

Verwandte Themen