Warum ist die übergabe eines string-literal in einem char* - argument nur manchmal zu einem compiler-Fehler?

Arbeite ich in einer C-und C++ - Programm. Wir kompilieren ohne make-Saiten-beschreibbar option. Aber das war immer eine ganze Reihe von Warnungen, so dass ich es ausgeschaltet habe.

Dann bekam ich eine ganze Reihe von Fehlern in der form "kann Nicht konvertieren, const char* zu char* argmuent 3 der Funktion foo". So, ich ging durch und hat eine ganze Menge änderungen festzusetzen.

Heute jedoch, das Programm STÜRZTE ab, weil das literal "" war immer die einer Funktion übergeben werden, die erwartet einen char*, und die Einstellung war, das 0. Zeichen auf 0. Es war nicht alles schlecht, nur versucht zu Bearbeiten, eine Konstante ist, und abstürzt.

Meine Frage ist, warum war nicht so, dass ein compiler-Fehler?

Falls es eine Rolle spielt, wurde diese auf einem mac kompiliert mit gcc-4.0.

EDIT: code Hinzugefügt:

char * host = FindArgDefault("EMailLinkHost", "");
stripCRLF(linkHost, '\n');

wo:

char *FindArgDefault(char *argName, char *defVal) 
{//simplified
    char * val = defVal;
    return(val);
}

und

void stripCRLF(char *str, char delim)
{
    char *p, *q;

    for (p = q = str; *p; ++p) {
        if (*p == 0xd || *p == 0xa) {
            if (p[1] == (*p ^ 7)) ++p;
            if (delim == -1) *p = delim;
            }
        *q++ = *p;
        }
    *q = 0;  //DIES HERE
}

Diese kompilierte und lief, bis er versuchte, zu *q 0...

EDIT 2:

Meisten Leute sind fehlt der Punkt meiner Frage. Ich weiß, warum char foo[] = "bar" arbeiten. Ich weiß, warum char * foo = "bar"; funktioniert nicht.

Meine Frage ist meist mit Bezug auf die übergabe von Parametern. Eine Sache, die existiert für mich "Ist es möglich, dass dies einem C vs C++ Problem?", weil ich einige .in c-Dateien und einige .cpp-Dateien, und es ist durchaus möglich, dass C es zulässt, aber C++ nicht... oder Umgekehrt...

Hast du Beispiel-code, den wir betrachten können?
Die Faustregel ist, dass, sollten Sie die Behandlung von string-Literale immer als const char *. Behandeln Sie als char * stellt Sie für diese Art von Problemen.
natürlich. Meine Frage ist, warum der compiler fangen EINIGE von Ihnen, aber nicht alle...
Das Verhalten von dem code, den Sie Hinzugefügt haben, ist vollkommen logisch. Ja, dies sollte kompilieren und ausführen, bis Sie versuchen, ändern Sie etwas. Allerdings, so wie ich es verstanden habe, Ihr Hauptproblem war, dass der compiler entdeckt einige Fehler und konnte nicht erkennen, einige andere Fehler. Das in einer der "gescheiterten". Jetzt zeigen Sie uns ein successfuly "erkannt".
Sie haben drei Funktionen. Man nennt eine Funktion zurück, was sich auf die ein Zeiger auf ein string-literal und ordnet, dass eine char *, und ruft dann eine Funktion zu ändern. Sie nicht machen es einfach für den compiler, um herauszufinden, was Los ist. Die tödliche Umwandlung ist mit dem Aufruf FindArgDefault(), und alles andere ist richtig. Es gibt viel alten code, der nicht const-korrekt, und es ist zulässig, nach der Norm zu übergeben wird ein string-Literals zu einer char * (obwohl nicht definiertes Verhalten, um zu versuchen, es zu ändern). Ich denke, Sie erwarten zu viel von gcc.

InformationsquelleAutor Brian Postow | 2010-05-03

Schreibe einen Kommentar