War das eine versehentliche Auslassung? Ist es sicher, dies mit const_cast zu umgehen? Oder kritzeln einige execvp-Implementierungen tatsächlich in diesen Speicher?
Das argv[] und envp[] Arrays von Zeigern und die Zeichenfolgen, auf die diese Arrays zeigen, dürfen nicht durch einen Aufruf einer der exec-Funktionen geändert werden, außer als Folge des Ersetzens des Prozessabbilds.
Ich denke, die fehlenden (oder verlegten) const ist einfach eine historische Kuriosität.
Das fehlende const ist keine historische Kuriosität; Vielmehr liegt es daran, dass Sie nicht von a konvertieren können char** zu einem const char* const* in C ohne Besetzung (aber du kann in C++).
– Adam Rosenfield
4. Mai 2012 um 21:57 Uhr
@Adam: stimmt. Das ist die Antwort auf die erste Frage im Beitrag. Davon habe ich Abstand genommen: c-faq.com/ansi/constmismatch.html
– Michael Burr
4. Mai 2012 um 22:10 Uhr
Siehe auch den Abschnitt BEGRÜNDUNG am Ende der POSIX-Spezifikation für exec. Es erklärt die Wahl der const Weglassung.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
5. Mai 2012 um 2:56 Uhr
@AdamRosenfield Dann sollte der Standard eine separate #ifdef __cplusplus-Deklaration hinzufügen, die es dem C++-Programm ermöglicht, konstant korrekt zu sein.
– Benutzer877329
5. August 2013 um 12:17 Uhr
Kai Salbei
Ich bin auf dieselbe Situation gestoßen. Weil execvp() eine hat char *const als zweiter Parameter, das heißt, es akzeptiert einen konstanten Zeiger auf ein Zeichen. Wenn Sie ihm also ein Zeigerzeichen übergeben, kann es das Zeigerzeichen in einen konstanten Zeiger auf ein Zeichen umwandeln. Also, anstatt es zu deklarieren
Obwohl die
exec*
Familie von Funktionen ändert ihre Argumente nicht wie in der POSIX-Spezifikation angegeben, beachten Sie, dass unter WindowsCreateProcess
erfordert eine beschreibbare Befehlszeile.– Adam Rosenfield
4. Mai 2012 um 22:00 Uhr