2016-04-03 26 views
1

Der folgende Code kann nicht kompiliert:Convert Typ „char **“ auf „const char **“

char** s; 
    const char** s2 = s; 

Ich weiß, dass das Folgende funktionieren kann, aber ich denke, es sollte etwas besser legitime Art und Weise zu tun, es?

long long x = reinterpret_cast<long long>(s); 
    s2 = reinterpret_cast<const char**>(x); 

Der Hintergrund dieser Frage ist, dass ich zwei Bibliotheken verwenden möchten, die Funktionen Umgang mit argc/argv mit unterschiedlichen Signaturen haben:

void Init1(int argc, char** argv); 
void Init2(int argc, const char** argv); 

Dann was ist der beste Weg, um meine Unterschrift des Haupt definieren beide dieser beiden Funktionen aufrufen?

Antwort

2

In C++ Sie const -ness durch const_cast hinzufügen oder entfernen können, zum Beispiel:

char** s; 
const char** t = const_cast<const char**>(s); 

Da Sie mit argv beschäftigen sollte es ziemlich sicher sein const-ness, um sie so lange wie die Init2 doesn hinzufügen Versuch nichts zu ändern, und es sollte nicht seit seinem Argument const char** sein.

Beachten Sie, dass das Ändern des Werts einer Variablen, die const war, nach dem Entfernen des CV-Qualifikationsmerkmals zu einem undefinierten Verhalten führt.

+0

Das Problem mit dieser Konvertierung wäre nicht mit 'Init2' versuchen, const Zeichen zu ändern (was es nicht ohne eine Umwandlung tun kann), ist es mit der Einstellung der' const char * 'auf die Adresse eines zu zeigen actual 'const char', und dann zum Beispiel' Init1', der versucht, die Zeichen an dieser Adresse zu modifizieren, was, soweit er weiß, vollkommen sicher sein sollte, da sein Argument 'char **' ist. Also nein, das ist nicht sicher. Deshalb beschwert sich der Compiler. –