10 Stimmen

String-Literale vs. const char* in C

Warum kennzeichnen ANSI-C-Compiler nicht die Verwendung eines String-Literal-Arguments in einem Funktionsaufruf, bei dem der entsprechende Parameter keinen const-Qualifier hat? Zum Beispiel könnte der folgende Code eine Ausnahme erzeugen, wenn er versucht, in einen reinen Lesespeicher zu schreiben.

void somefunc(char buffer[10]);

void somefunc(char buffer[10]) {
    int i;

    for (i = 0;   i < 10;   i++)
       buffer[i] = 0;
}

int main(int argc, char **argv) {

    somefunc("Literal");
    return 0;
}

Diese Situation könnte zur Kompilierzeit erkannt werden, aber VS2010 und gcc scheinen dies nicht zu tun. Der Aufruf von somefunc mit einem const char* Argument erzeugt eine Compilerwarnung.

16voto

Hans Passant Punkte 894572

Es ist ein Vermächtnis von K&R. Eine Reparatur würde eine Million Programme zerstören.

11voto

Jukka Suomela Punkte 11731

Gcc: Verwenden Sie das Flag -Wwrite-strings

PS. Das gcc-Handbuch erklärt, warum dies nicht Teil von -Wall ist. Wie auch immer, Sie sollten eine Kombination von -W-Flags finden, die Ihren speziellen Bedürfnissen und Ihrem Programmierstil entspricht. In einem kürzlichen Projekt habe ich zum Beispiel so etwas verwendet: -Werror -Wall -Wextra -Wformat=2 -Winit-self -Wswitch-enum -Wstrict-aliasing=2 -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wdisabled-optimization -Wunused-macros -Wno-unused

7voto

ninjalj Punkte 40810

Was Hans Passant sagte. const wurde 1989 als Teil des ANSI-Standards hinzugefügt, so dass alles, was davor war, nicht über const verfügte.

6voto

frankc Punkte 10886

String-Literale sind in C nicht const; in C++ sind sie es.

edit: Um jegliche Verwirrung über meinen Kommentar auszuräumen, beziehe ich mich auf den Typ, nicht auf die Möglichkeit, sie tatsächlich zu ändern.

4voto

lunaryorn Punkte 32342

Der GNU-Compiler (und auch der Intel-C-Compiler, iirc) gibt eine Warnung aus, wenn -Wwrite-string verwendet wird:

$ gcc -Wall -Wwrite-strings -o foo /tmp/foo.c
/tmp/foo.c: In function 'main':
/tmp/foo.c:12: warning: passing argument 1 of 'somefunc' discards qualifiers from pointer target type
/tmp/foo.c:3: note: expected 'char *' but argument is of type 'const char *'

Was VS2010 betrifft, kann ich Ihnen nicht helfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X