Während ich meinen Code hier überprüfen ließ, tauchte das Problem der Verwendung des const
Schlüsselworts auf. Ich verstehe, dass es zum Implementieren von Nur-Lese-Verhalten für Variablen verwendet wird.
Ich bin verwirrt über die verschiedenen Situationen, in denen es nützlich sein kann.
- Sollte es aus Gründen der Klarheit in Funktionsprototypen verwendet werden?
- Sollte es als Sicherheitsmaßnahme während der Codeentwicklung verwendet werden?
- Soll es im Rahmen verschiedener Funktionen zur Deklaration von Laufzeitkonstanten verwendet werden?
- Sollte es überhaupt verwendet werden?
Diese Frage ist nur ein Beispiel für die Verwirrung, mit der ich konfrontiert bin. Die allgemeine Verwirrung ist
- Wann sollte das
const
Schlüsselwort in der C-Programmierung verwendet werden? - Welche verschiedenen Arten von Vorteilen können mit diesem Schlüsselwort in C erzielt werden?
- Gibt es irgendwelche Nachteile der Verwendung von
const
Schlüsselwörtern?
Es wurde darauf hingewiesen, dass diese Frage aufgrund all dieser Fragen im Detail meiner Frage zu weit gefasst sein kann. Ich wollte nur klarstellen, dass diese Fragen nur die Verwirrung in Bezug auf die Hauptfrage klären sollen.
Wann und für welche Zwecke sollte das Schlüsselwort const in C für Variablen verwendet werden?
Es kann auch umformuliert werden als
Die richtige Verwendung von
const
Schlüsselwörtern in C` mit den Vor- und Nachteilen derselben.
c
readability
patterns-and-practices
const
Aseem Bansal
quelle
quelle
Specific issues with software development
. Ich bin ziemlich spezifisch.specific issue
. Die richtige Verwendung vonconst
Schlüsselwörtern in C` mit den Vor- und Nachteilen derselben.Antworten:
Beim Überprüfen des Codes wende ich die folgenden Regeln an:
Verwenden Sie immer
const
für Funktionsparameter, die als Referenz übergeben werden, wenn die Funktion die Daten, auf die verwiesen wird, nicht ändert (oder freigibt).Verwenden Sie immer
const
für Konstanten, die andernfalls mit einem #define oder einer Enumeration definiert werden könnten. Dadurch kann der Compiler die Daten im Nur-Lese-Speicher (ROM) lokalisieren (obwohl der Linker in eingebetteten Systemen häufig ein besseres Werkzeug für diesen Zweck ist).Nie const in einer Funktion verwenden Prototyp für einen Parameter von übergeben Wert . Es hat keine Bedeutung und ist daher nur "Lärm".
Verwenden Sie sie gegebenenfalls
const volatile
an Orten, die vom Programm nicht geändert werden können, sich aber möglicherweise noch ändern. Hardware-Register sind hier der typische Anwendungsfall, zum Beispiel ein Statusregister, das einen Gerätezustand widerspiegelt:Andere Verwendungen sind optional. Zum Beispiel können die Parameter an eine Funktion in der Funktion Implementierung kann als const gekennzeichnet werden.
oder Funktion Rückgabewerte oder Berechnungen, die erhalten werden und sich dann nie ändern:
Diese Verwendungen von
const
weisen lediglich darauf hin, dass Sie die Variable nicht ändern werden. Sie ändern nicht, wie oder wo die Variable gespeichert wird. Der Compiler kann natürlich feststellen, dass eine Variable nicht geändert wird, aber indemconst
Sie sie hinzufügen, können Sie dies erzwingen. Dies kann dem Leser helfen und zusätzliche Sicherheit bieten (obwohl Sie möglicherweise andere Probleme haben, wenn Ihre Funktionen so umfangreich oder kompliziert sind, dass dies einen großen Unterschied ausmacht). Bearbeiten - zB. Eine dicht codierte 200-Zeilen-Funktion mit verschachtelten Schleifen und vielen langen oder ähnlichen Variablennamen, die weiß, dass sich bestimmte Variablen niemals ändern, kann das Verständnis erheblich erleichtern. Solche Funktionen wurden schlecht entworfen oder gewartet.Probleme mit
const
. Sie werden wahrscheinlich den Begriff "const Vergiftung" hören. Dies tritt auf, wenn das Hinzufügenconst
zu einem Funktionsparameter die Ausbreitung von 'constness' verursacht.Edit - const Vergiftung: zum Beispiel in der Funktion:
wenn wir ändern
str
zuconst
müssen wir dann dafür sorgen , dassfuction_b
auch ein nimmtconst
. Und so weiter , wennfunction_b
passiert dasstr
auffunction_c
usw. Wie man sich vorstellen kann dies schmerzhaft sein könnte , wenn es viele einzelne Dateien / Module breitet sich in. Wenn es sich in eine Funktion ausbreitet, die nicht geändert werden kann (z. B. eine Systembibliothek), ist eine Umwandlung erforderlich. Wenn Sie alsoconst
in vorhandenem Code herumstreuen, müssen Sie vielleicht Ärger machen. In neuem Code ist es jedoch am besten,const
bei Bedarf eine konsistente Qualifizierung vorzunehmen .Das heimtückischere Problem
const
ist, dass es nicht in der Originalsprache war. Als Add-On passt es nicht ganz. Erstens hat es zwei Bedeutungen (wie in den obigen Regeln, was bedeutet "Ich werde das nicht ändern" und "Das kann nicht geändert werden"). Aber darüber hinaus kann es gefährlich sein. Kompilieren Sie diesen Code und führen Sie ihn aus. Je nach Compiler / Optionen kann er bei der Ausführung abstürzen:strchr
gibt achar*
nicht a zurückconst char*
. Wie der Aufrufparameter istconst
muss sie werfen den Aufrufparameter anchar*
. In diesem Fall wird die eigentliche schreibgeschützte Speichereigenschaft verworfen. Bearbeiten: - Dies gilt im Allgemeinen für Variablen im Nur-Lese-Speicher. Mit "ROM" meine ich nicht nur das physische ROM, sondern jeden Speicher, der schreibgeschützt ist, wie es bei den Code-Abschnitten von Programmen unter einem typischen Betriebssystem der Fall ist.Viele Standard-Bibliotheksfunktionen verhalten sich genauso, seien Sie also vorsichtig : Wenn Sie echte Konstanten haben (dh im ROM gespeichert sind), müssen Sie sehr vorsichtig sein, um ihre Konstanz nicht zu verlieren.
quelle
const volatile
Variable zu haben .const
Variable schreibgeschützt:const
"Dies kann nicht geändert werden". Aconst volatile
hingegen sagt "Dies kann nicht geändert werden, aber es kann sich ändern". Ich werde meiner Antwort eine Erwähnung der Flüchtigen hinzufügen.const
Variable durch einen Nicht-const
Zeiger ändern " führen kann (eine häufige Frage zu SO und jedem anderen C-Forum) !). Insgesamt mag ich diese Antwort aber :)const
sowohl schreibgeschützte Daten als auch schreibgeschützte Ansichten von Daten deklariert werden .Generell wird in jeder Programmiersprache empfohlen,
const
den entsprechenden Modifikator zu verwendenquelle
Ja, das ist im Grunde die Antwort von TheLQ.
Ist eine Sicherheitsmaßnahme für den Programmierer, damit Sie eine Variable nicht ändern und keine Funktionen aufrufen, die sie möglicherweise ändern. In einem Array oder einer Struktur gibt der const-Bezeichner an, dass die Werte ihres Inhalts nicht geändert werden, und selbst der Compiler lässt dies nicht zu. Sie können den Wert der Variablen jedoch immer noch leicht mit nur einer Umwandlung ändern.
In dem, was ich normalerweise sehe, wird es hauptsächlich verwendet, um konstante Werte in Code einzufügen und um anzuzeigen, dass das Array oder die Struktur nicht geändert wird, wenn Sie eine bestimmte Funktion aufrufen. Dieser letzte Teil ist wichtig, da Sie beim Aufrufen einer Funktion, die Ihr Array oder Ihre Struktur ändert, möglicherweise die Originalversion beibehalten möchten, also eine Kopie der Variablen erstellen und diese dann an function übergeben. Wenn dies nicht der Fall ist, benötigen Sie die Kopie natürlich nicht, damit Sie zum Beispiel ändern können,
zu
und nicht die Kopie Overhead bekommen.
Beachten Sie zum Hinzufügen, dass C bestimmte Regeln für den const-Bezeichner hat. Zum Beispiel,
ist nicht dasselbe wie
Mit dem ersten Code können Sie a nicht ändern. Im zweiten Fall ist der Zeiger konstant, sein Inhalt jedoch nicht. Der Compiler ermöglicht es Ihnen,
* a = 3;
ohne einen Compilerfehler zu sagen , aber Sie können nichta
auf eine andere Sache verweisen.quelle
In Übereinstimmung mit den Aussagen von TheLQ:
Wenn Sie mit einem Team von Programmierern zusammenarbeiten,
const
ist die Deklaration eine gute Möglichkeit, um anzuzeigen, dass die Variable nicht geändert werden sollte, oder nur, um sich an große Projekte zu erinnern. In diesem Sinne ist es nützlich und kann viele Kopfschmerzen ersparen.quelle