Deklarieren Sie einen Zeiger auf const oder const-Zeiger auf const als einen formalen parameter
Ich war vor kurzem einige Anpassungen an code, wobei ich mich ändern musste einen formalen parameter in einer Funktion. Ursprünglich sind die parameter ähnlich der folgenden (beachten Sie, dass die Struktur typedef würde früher):
static MySpecialStructure my_special_structure;
static unsigned char char_being_passed; //Passed to function elsewhere.
static MySpecialStructure * p_my_special_structure; //Passed to function elsewhere.
int myFunction (MySpecialStructure * p_structure, unsigned char useful_char)
{
...
}
Die änderung wurde vorgenommen, da konnte ich definieren und initialisieren my_special_structure vor der Kompilierung und myFunction nie geändert, den Wert der it. Dies führte zu der folgenden Veränderung:
static const MySpecialStructure my_special_structure;
static unsigned char char_being_passed; //Passed to function elsewhere.
static MySpecialStructure * p_my_special_structure; //Passed to function elsewhere.
int myFunction (const MySpecialStructure * p_structure, unsigned char useful_char)
{
...
}
Mir ist auch aufgefallen, dass, wenn ich lief Fusseln auf meinem Programm, dass es mehrere Info-818 ' s verweisen auf eine Reihe von verschiedenen Funktionen. Die info angegeben, dass "Zeiger-parameter 'x' (Linie 253) deklariert werden könnte als Hinweis auf const".
Nun, ich habe zwei Fragen in Bezug auf die oben genannten. Erste, in Bezug auf den obigen code, da weder die Zeiger noch die Variablen innerhalb MySpecialStructure geändert wird, innerhalb der Funktion, ist es von Vorteil zu deklarieren, die Zeiger als konstant gut? z.B. -
int myFunction (const MySpecialStructure * const p_structure, unsigned char useful_char)
Meine zweite Frage ist in Bezug auf die Lint Informationen. Gibt es irgendwelche Vorteile oder Nachteile zu deklarieren Zeiger als ein konstanter formaler parameter wenn die Funktion sich nicht ändert, seinen Wert... auch wenn das, was Sie auf der Durchreise sind, ist die Funktion nie erklärt, wie eine Konstante? z.B. -
static unsigned char my_char;
static unsigned char * p_my_char;
p_my_char = &my_char;
int myFunction (const unsigned char * p_char)
{
...
}
Vielen Dank für Ihre Hilfe!
Bearbeitet für die Klarstellung -
Was sind die Vorteile zu deklarieren, Zeiger auf const
oder eine const
Zeiger auf const
- als einen formalen parameter? Ich weiß, dass ich kann es tun, aber warum würde ich wollen... vor allem in dem Fall, wo der Zeiger übergeben und die Daten auf die es hinweist, sind nicht deklarierte Konstante?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bin ich davon ausgegangen, du meintest einen Zeiger auf
const
.Durch einen Zeiger auf
const
als parameter, der Vorteil ist, dokumentieren Sie die API, indem der Programmierer eine Funktion nicht ändern, das Objekt zeigte der Zeiger.Beispielsweise anschauen
memcpy
Prototyp:Sagt es der Programmierer das Objekt verweist
s2
werden nicht geändert durchmemcpy
nennen.Es bietet auch compiler erzwungen Dokumentation der Implementierung, stellt eine Diagnose, wenn Sie ändern einen pointee von einem Zeiger auf
const
.const
, danke..., ich hasse es, wenn ich versuchen zu klären, um noch mehr Verwirrung.Wenn Sie deklariert einen formalen parameter als
const
, kann der compiler überprüfen, dass Ihr code nicht zu ändern versuchen, die parameter, was zu höherer software-Qualität.const
ermöglicht auch, um anzuzeigen, die Benutzer Ihrer Funktion, die Sie nicht ändern Sie diesen parameter hinter Ihrem RückenConst-correctness ist eine wunderbare Sache. Für eine, es ermöglicht dem compiler helfen, halten Sie vor Fehlern. Eine offensichtlich einfache Fall ist die Zuordnung, wenn Sie eigentlich zu vergleichen. In diesem Beispiel wird, wenn sich der Zeiger ist const der compiler meldet einen Fehler. Google "const-Korrektheit" und finden Sie viele Ressourcen auf die Vorteile der es.
Für Ihre erste Frage, wenn Sie sind verdammt sicher nicht, ändern Sie entweder die Zeiger oder die variable Punkte zu, können Sie sich mit allen Mitteln gehen Sie vor und machen Sie beide konstant!
Nun, für Ihre Qn, warum deklarieren Sie eine formale Zeiger-parameter als const obwohl die übergebenen Zeiger nicht konstant, Ein typischer Anwendungsfall ist die Bibliothek-Funktion
printf()
.printf
soll akzeptierenconst char *
aber der compiler nicht zu beanstanden, selbst wenn Sie an einemchar*
zu. In einem solchen Fall macht es Sinn, dassprintf()
nicht bauen auf der Benutzer-Fehler und ändern Sie die Daten des Benutzers versehentlich! Wieprintf()
deutlich sagen -, Ob Sie an einemconst char *
oderchar*
, keine Sorge, ich immer noch nicht ändern Sie Ihre Daten!Ihre zweite Frage,
const
Zeiger finden hervorragende Anwendung in der embedded-Welt, wo wir in der Regel schreiben Sie eine Speicher-Adresse direkt ein. Hier ist die ausführliche ErklärungGut, was sind die Vorteile zu deklarieren, alles andere als ein
const
gleichzeitig haben Sie die option, um es nicht zu tun? Nach allem, wenn Sie berühren Sie es nicht, ist es egal, ob esconst
oder nicht. Dies bietet einige Sicherheits-checks, die der compiler für Sie tun kann, und es gibt einige Informationen über die Funktion der Schnittstelle. Zum Beispiel, Sie können sicher übergeben Sie einen string-literal-eine Funktion, die erwartet, dass einconst char *
, aber Sie müssen vorsichtig sein, wenn die parameter deklariert wird, als nur einchar *
.