2016-03-27 10 views
2

Eine Funktion erklärtIst die zweite Konstante in void f (char const * const p)?

void f(const char * const p) { ... } 

bedeutet, dass es einen konstanten Zeiger auf einen konstanten Charakter annimmt. Aber ist die Variable nur innerhalb der Funktion selbst und ihre Verwendung vor dem Aufgerufenen verborgen, spielt es eine Rolle, ob die zweite const da ist?

Mit anderen Worten, wäre das Folgende aus Sicht des Angerufenen nicht semantisch identisch mit dem ersten?

void f(const char *p) { ... } 

Antwort

2

Der erste const zeigt an, dass Sie nicht die Daten zeigen ändern können, zeigt die zweite, dass dieser Zeiger nicht überschrieben werden kann.

Also, für einen Aufrufer dieser Funktion ist es egal. Für die Implementierung der Funktion kann es nützlich sein, obwohl es nur lokal wirkt.

0

Ja, ich glaube schon. Die zusätzliche const bedeutet hier nur, dass der Implementierer p in der Implementierung von f nicht zuweisen darf, um auf ein anderes Zeichen oder eine C-artige Zeichenfolge zu verweisen.

2

Die zweite const (die nach der *) spielt keine Rolle aus der Sicht der Callee.

Aber es ist aus der Sicht des Funktionskörpers wichtig. Die zweite const stellt sicher, dass Sie nicht den Zeiger seinen Wert ändern können (d. H. Auf einen anderen Speicherort verweisen).

Es vergleichbar ist ein einfachen primitiven Parameter wie const zu erklären, wie in void f(const int value) {}

+1

Allgemeiner ist es vergleichbar (identisch) zu erklären _any_ lokale Variable "const", nicht nur Parameter. – emlai

1

Ja. Sie sagen dem Compiler, dass Sie in dieser Funktion nicht ändern werden. Dies ermöglicht dem Compiler bestimmte Optimierungen, z. Wenn sich bereits in einem Register befindet, müssen Sie es nicht speichern und müssen kein neues Register zuweisen.

Es bewirkt auch, dass der Compiler eine Diagnose ausgibt, wenn Sie versuchen, p zu ändern, z. ++p oder p = ... weil das das Versprechen verletzt, das Sie gemacht haben.

+0

Es ist nicht _allow_ der Compiler, die Optimierungen zu tun, die Sie erwähnten. Selbst wenn es nicht-const ist, kann der Compiler einfach schauen, ob die Variable innerhalb der Funktion geändert wird, und wenn dies nicht der Fall ist, die gleichen Optimierungen vornehmen. – emlai

+0

@zenith Guter Punkt. Vielleicht * Hinweis * könnte ein besseres Wort sein. Aber es erlaubt dem Compiler sicherlich, die gesamte Überprüfung von p-Konstanten zu überspringen, sodass eine gewisse Optimierung der Kompilierungszeit möglich ist. – Jens

+0

Ja, es optimiert den Optimierungsprozess. – emlai