Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum aufruf strchr() mit einem const char
Hallo,
hatte mit Valgrind ein paar Fehler in meinem Programm gefunden. Einige Fehler wurden wohl durch die Lib-Versionen verursacht und ich hab mein System aktualisiert. Jetzt erhalte ich beim compilieren jedoch einen Fehler in einer Methode mit strchr().
Alter Code
char*
parseSomething( const char* line )
{
char* strPtr;
if( ( strPtr = strchr( line, (int) '"' ) ) != NULL )
{
//do something
}
...
}
Der Compiler meint dann:
error: invalid conversion from 'const char*' to 'char*'
Wenn ich bei der Übergabe an strchr() line nun caste funktioniert es wieder (--> strchr( (char*) line, (int) '"' )).
Kann mir jemand den Sachverhalt erklären, da doch strchr( const char*, int ) auch mit const char* definiert ist.
Gruß data
locus vivendi
27-04-2010, 15:59
Die Funktion strchr ist in C++ zweimal definiert, einmal als "char* strchr(char*, int)" und ein weiteres mal als "char const* strchr(char const*, int)". Kann sein, dass deine frühere C++ Implementierung fälschlicherweise nur die erste Definition zur Verfügung stellte. Die Linux-Manpage zu strchr weist auch nur eine Signatur auf - sie ist deshalb für C++ einfach nicht gültig.
undefined
27-04-2010, 16:06
Du verwendest eine funktion die dem Compiler nicht bekannt, aber in der Bibliothek vorhanden ist ;)
Ich tippe auf fehlende #include "string.h" Definition.
PS:
Der Compiler bricht deshalb nicht ab weil es sich um einen Standard handelt POSIX etc.
Wenn du aber deine Compiler flags mal Hoch schraubst sollte er dir das auch melden.
LC_ALL=C gcc -Wall -W -Wextra -pedantic -o test demo.c
demo.c: In function 'parseSomething':
demo.c:13: warning: implicit declaration of function 'strchr'
demo.c:13: warning: incompatible implicit declaration of built-in function 'strchr'
Hi,
danke für die hilfreichen Antworten.
Interessant das die Funktion zweimal definiert ist.
#include <string.h> ist drinne, nur ist mir bei dem Compileraufruf dann aufgefallen, dass ich irgendwie in's gewohnte g++ gefallen bin und welch ein Zufall das er dann mit der C++-Variante arbeiten möchte ... *wiederfreiesichtohnebrettvormkopf*
Durch das ganze Valgrinden und die libc-Fehler bin ich wohl etwas Durch gegangen.
Danke für den Tipp mit dem hohen Compilerflags, direkt noch was gefunden dadurch.
Gruß data
locus vivendi
27-04-2010, 19:42
include <string.h> ist drinne, nur ist mir bei dem Compileraufruf dann aufgefallen, dass ich irgendwie in's gewohnte g++ gefallen bin und welch ein Zufall das er dann mit der C++-Variante arbeiten möchte
Lusting daran ist ja, dass bei Verwendung von C++ keinesfalls die Signatur von C vorhanden ist, die lautet nämlich "char* strchr(char const*, int)". Wenn du also z.b. g++ zum compilieren verwendest, benutzt du immer eine der C++ Varianten.
Lusting daran ist ja, dass bei Verwendung von C++ keinesfalls die Signatur von C vorhanden ist, die lautet nämlich "char* strchr(char const*, int)". Wenn du also z.b. g++ zum compilieren verwendest, benutzt du immer eine der C++ Varianten.
Ja, genau das meine ich auch. :)
Ich hab so nach den Valgrind-Ausgaben geschaut, dass ich auf einmal wohl mit g++ angefangen habe zu compilieren (Warum auch immer!? :confused:)...
Naja, es sind noch nicht so viele Zeilen Code, jedoch zeigt es mir ganz gut, dass man direkt ein makefile hätte erstellen sollen ...
Eine Fehlerquelle die man einfach umgehen hätte können.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.