Warum gibt das folgende Programm einen Fehler?
-
25-09-2019 - |
Frage
Warum wird das folgende Programm eine Warnung aus?
Hinweis . Seine Hand, dass ein normalen Zeiger auf eine Funktion erfordern const Zeiger zu senden gibt keine Warnung
#include <stdio.h>
void sam(const char **p) { }
int main(int argc, char **argv)
{
sam(argv);
return 0;
}
Ich erhalte die folgenden Fehler,
In function `int main(int, char **)':
passing `char **' as argument 1 of `sam(const char **)'
adds cv-quals without intervening `const'
Lösung
Dieser Code verletzt const Korrektheit.
Das Problem ist, dass dieser Code grundsätzlich unsicher ist, weil Sie versehentlich ein konstantes Objekt ändern könnten. Die C ++ FAQ Lite verfügt über ein ausgezeichnetes Beispiel dafür in der Antwort auf " Warum bin ich erhalte eine Fehlermeldung ein Foo**
? Foo const**
Umwandlung? "
class Foo {
public:
void modify(); // make some modify to the this object
};
int main()
{
const Foo x;
Foo* p;
Foo const** q = &p; // q now points to p; this is (fortunately!) an error
*q = &x; // p now points to x
p->modify(); // Ouch: modifies a const Foo!!
...
}
(Beispiel von Marshall Cline C ++ FAQ Lite Dokument, www.parashift.com/c++- FAQ-lite / )
Sie können das Problem beheben, indem const-Qualifikation beide Dereferenzierungsebenen:
void sam(char const* const* p) { }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow