Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Frage zum aufruf strchr() mit einem const char

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.11.2007
    Beiträge
    8

    Question 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
    Code:
    char*
    parseSomething( const char* line )
    {
        char* strPtr;
    
        if( ( strPtr = strchr( line, (int) '"' ) ) != NULL )
        {
            //do something
        }
        ...
    }
    Der Compiler meint dann:
    Code:
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  3. #3
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    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.
    Code:
    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'
    Geändert von undefined (27-04-2010 um 17:30 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  4. #4
    Registrierter Benutzer
    Registriert seit
    22.11.2007
    Beiträge
    8
    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

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  6. #6
    Registrierter Benutzer
    Registriert seit
    22.11.2007
    Beiträge
    8
    Zitat Zitat von locus vivendi Beitrag anzeigen
    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!? )...

    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.

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •