Der folgende Codeausschnitt (richtig) eine Warnung in C und einen Fehler in C++ gibt (mit gcc & g ++ jeweils mit den Versionen 3.4.5 und 4.2.1 getestet; MSVC zu kümmern scheint nicht):Warum kann ich in C nicht 'char **' in 'const char * const *' umwandeln?
char **a;
const char** b = a;
Ich kann das verstehen und akzeptieren.
Die C++ - Lösung für dieses Problem besteht darin, b zu ändern, um ein const char * const * zu sein, das die Neuzuweisung der Zeiger nicht zulässt und Sie daran hindert, const-correctity zu umgehen (C++ FAQ).
char **a;
const char* const* b = a;
jedoch in reinem C, die korrigierte Version (const char * const * verwendet) gibt immer noch eine Warnung, und ich verstehe nicht, warum. Gibt es eine Möglichkeit, dies zu umgehen, ohne einen Cast zu verwenden?
Zur Verdeutlichung:
1) Warum generiert dies eine Warnung in C? Es sollte vollständig const-safe sein, und der C++ - Compiler scheint es als solches zu erkennen.
2) Was ist der richtige Weg, dieses Char ** als Parameter zu akzeptieren, während ich sage (und den Compiler durchsetzen), dass ich die Zeichen, auf die es zeigt, nicht verändern werde? Zum Beispiel, wenn ich eine Funktion schreiben wollte:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
Und ich wollte sie auf ein Zeichen aufzurufen **, was wäre der richtige Typ für den Parameter sein?
Bearbeiten: Vielen Dank an diejenigen, die geantwortet haben, vor allem diejenigen, die die Frage adressiert und/oder meine Antworten verfolgt.
Ich habe die Antwort akzeptiert, dass was ich tun möchte, kann nicht ohne eine Besetzung getan werden, unabhängig davon, ob es möglich sein sollte oder nicht.
Ich bin verwirrt auf Ihre Frage, ist es: "Wie bekomme ich C, mich nicht zu warnen?" oder ist es "Wie bekomme ich C++, um einen Kompilierungsfehler nicht zu werfen?" Oder vielleicht ist es keiner von diesen. – user7116
Ich stimme sechs Variablen zu, diese Frage bedarf weiterer Klärung. –
Die Frage ist: "Warum kann ich 'char **' nicht in 'char * const * konvertieren?" – Kevin