2016-07-29 5 views
2

Ich habe kürzlich über die Verwendung von const Schlüsselwort als Funktion Argumente in C und die Art zu verwenden, die in When and for what purposes should the const keyword be used in C for variables erwähnt wurde und als richtige Antwort akzeptiert wurde. In diesem Beitrag erwähnt ein Punkt, dassWarum ist const in Funktionsdeklarationen in Headerdateien für Parameter, die als Wert übergeben werden, nicht erforderlich?

nie const in einem Funktionsprototyp für einen Parameter von Wert übergeben verwenden. Es hat keine Bedeutung und ist daher nur "Lärm".

habe ich diese Art und Weise und es funktioniert für mich, aber ich bin nicht sicher, warum das eine ist Rauschen für Parameter Wert übergeben und noch kein Lärm für die durch Verweis übergebenen Parameter (treffender die Zeigerwerte in C wie es gibt kein Konzept von pass by value und pass by reference in C). Also, durch diese Erklärung, wenn ich einen Zeiger als Funktion Argument übergeben und ein const Schlüsselwort verwenden; Ich muss dies sowohl für die Deklaration in der Header-Datei und die Definition in der C-Datei tun, aber ich brauche nicht das Schlüsselwort const für ein Nicht-Zeiger-Argument in der Deklaration (Header-Datei) und verwenden Sie es nur beim Definieren der Funktion in die C-Datei.

Irgendwelche Erklärungen?

+1

Da der Wert überschritten wird, hat das Ändern des Werts keine tatsächliche Auswirkung. Es const zu nennen, macht nicht viel. –

+1

Es spielt für den aufrufenden Code keine Rolle, ob 'double sqrt (double)' oder 'double sqrt (const double)' verwendet wird. Wenn der Benutzer folgendes hat: 'double x = 3.14; double y = sqrt (x); ', die Funktion' sqrt() 'kann die Variable' x' nicht ändern, unabhängig vom Vorhandensein oder Nichtvorhandensein von 'const' (und ein' const' im Rückgabetyp wäre sinnlos) . Es ist jedoch wichtig mit Zeigern.Wenn Sie 'char * fgets (const char * buffer, size_t buflen, FILE * fp);' haben, verspricht es, die Daten nicht zu ändern, auf die 'buffer' zeigt, wodurch es als Eingabefunktion impotent wird - es muss geändert werden der Puffer. –

Antwort

5

Die Aussage, die Sie angeben, ist ein bisschen irreführend, weil in C, alle Argumente durch Wert übergeben werden. * Ich denke, es wird versucht, zwischen den Argumenten selbst und für den speziellen Fall von Argumenten, die Zeiger sind, ihre Referenten zu unterscheiden.

In jedem Fall ist der Punkt, dass const -Qualifizierung eines Funktionsparameters in der Funktionsdeklaration keinerlei Informationen für Anrufer vermittelt. Unabhängig von dieser Qualifikation kann die Funktion die Kopie eines Arguments durch den Aufrufer trotzdem nicht ändern, da die Argumente als Wert übergeben werden.

* Beachten Sie jedoch, dass Arrays überhaupt nicht übergeben werden. In Funktionsaufrufausdrücken "zerfallen" Array-Werte wie in den meisten Kontexten in Zeiger, und diese Zeiger werden als Wert übergeben. Dies erzeugt einen ähnlichen, aber nicht identischen Effekt, wenn Arrays als Referenz übergeben werden.

2

Es ist die Regel. Wenn in der Erklärung einer Funktion, nicht wahr Ihre Parameter markieren const Sie können sie const in der Definition markieren.

Manche Leute möchten in der Definition so viele Parameter wie const als möglich markieren, da sie vor unbeabsichtigter Veränderung der Funktionsparameter schützen können; was könnte Fehler einführen. Persönlich mache ich das nicht, aber viele Häuser (einschließlich einer großen Bank mit Hauptsitz in Schottland) bestehen auf dem Stil.

+0

LSNED über Motivationen für die Verwendung von 'void foo (const int x) {...}' – chux

Verwandte Themen