Frage zu strtok() - Threadsicher?



  • strtok_s() ist eine Funktion der CRT, die funktioniert überall wo die CRT läuft, also ganz sicher auch auf Vista und 7 😉



  • Warum bekomme ich dann die folgenden Fehlermeldungen:

    C:\Users\0x02\Programme und Source\strtok_s\project\main.c(21) : warning C4013: 'strtok_s' undefined; assuming extern returning int
    
    Linking...
    main.obj : error LNK2001: unresolved external symbol _strtok_s
    Debug/project.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    


  • Code:

    #include <string.h>
    #include <stdio.h>
    
    char string1[] =
        "A string\tof ,,tokens\nand some  more tokens";
    char string2[] =
        "Another string\n\tparsed at the same time.";
    char seps[]   = " ,\t\n";
    char *token1,
         *token2,
         *next_token1,
         *next_token2;
    
    int main( void )
    {
        printf( "Tokens:\n" );
    
        // Establish string and get the first token: 
        token1 = strtok_s( string1, seps, &next_token1);
        token2 = strtok_s ( string2, seps, &next_token2);
    
        // While there are tokens in "string1" or "string2"
        while ((token1 != NULL) || (token2 != NULL))
        {
            // Get next token:
            if (token1 != NULL)
            {
                printf( " %s\n", token1 );
                token1 = strtok_s( NULL, seps, &next_token1);
            }
            if (token2 != NULL)
            {
                printf("        %s\n", token2 );
                token2 = strtok_s (NULL, seps, &next_token2); 
            }
        }
    }
    


  • Also bei mir (Visual Studio 2010) kompiliert das sowohl als C++ als auch als reines C ohne Probleme...



  • strtok_s gehört nicht zum C Standard, es ist eine Erweiterung von neueren MS-VC.
    Du verwendest eine Entwicklungsumgebung, die diese Funktion nicht unter diesem Namen anbietet, der Linker kann also den passenden Code nicht finden und genau das sagt er dir.



  • Der Fehlermeldung nach verwendet er eindeutig Visual C++. Es kann sich also eigentlich nur um eine uralte Version oder um ein Konfigurationsproblem handeln...



  • Ok war doch wohl eine etwas ältere Version von Visual C++ daran hats gelegen.
    Lade mir gerade jetzt gerade das Visual Studio C++ 2010 Pro. herunter.
    Muss irgendwas groß am Code geändert werden wenn ich von der alten Version auf die neuste Umsteige?



  • nein



  • Doch.
    Neuere VC haben standardmäßig Unicode eingeschaltet, ebenso das nichtstatische Linken. Mehr dazu gibt es beim MFC Forum.
    Außerdem ist die "frei" runterladbare Pro Version zeitlich in ihrer Verwendung begrenzt, ich glaube 90 Tage.



  • Wutz schrieb:

    Neuere VC haben standardmäßig Unicode eingeschaltet.

    Also bei einem neuen leeren Projekt ist bei mir kein Unicode eingeschaltet..



  • Doch.
    Sobald du in dein leeres Projekt eine .c Datei einfügst, steht unter Konfigurationseigenschaften/Allgemein/Zeichensatz "Unicode-Zeichensatz verwenden".
    Glaub mir, diese "Portierungseigenart" zw. älteren und neueren VC gehört zu den Tops.



  • Deswegen muss aber doch nichts

    0x02 schrieb:

    groß am Code geändert werden



  • Ach nein?
    Und Stringliterale? Ich habe mal gehört, dass diese in C Programmen häufiger vorkommen sollen.



  • Und? Wo ist das Problem, das Projekt mit einem Häkchen auf Multibyte umzukonfigurieren? Es war ja offensichtlich bis zu diesem Zeitpunkt auch kein Unicode-Projekt ...



  • Abgesehen davon wird, wenn er das Projekt konvertiert, dieses Häkchen richtig übernommen werden 😉



  • Ferner erwartet strtok_s keinen LPTSTR oder sonstige auf TCHAR aufbauende Typen und ist von der ganzen Problematik nicht betroffen.



  • Naja, das Projekt wird vielleicht aus mehr als strtok_s bestehen ...



  • Der vom Threadersteller gepostete Code enthielt nichts, was in diesem Zusammenhang kritisch wäre.

    Wenn es darum geht, ob es möglich ist, Code zu schreiben, der abhängig von bestimmten Projekteinstellungen kompilieren oder nicht kompilieren kann: Das ist der Fall. Ich halte das allerdings für keine sonderlich profunde Erkenntnis.



  • Es soll Windowsprogramme geben, die Windows-API Funktionen verwenden, und ein simples

    CopyFile("bla","fasel",0)
    

    wird unterschiedlich ablaufen, je nachdem, ob Unicode oder nicht.
    Deshalb ist die L/_TEXT/_T/wasweissich Anpassung für so verwendete Literale unumgänglich.
    Und da die meisten Quelltextautoren von der Auswertung von Rückgabewerten oder gar einer Fehlerbehandlung nicht viel halten und andere Quelltextautoren widerum vom Lesen von Compilerwarnungen ebensowenig, ist Nacharbeit und Anpassung im größeren Umfang nötig.



  • Und was hat das jetzt mit strtok_s() zu tun!? 🙄


Anmelden zum Antworten