strcpy was not declared



  • Hallo liebes Forum,

    seitdem ich in den Einstellungen meines Compilers rumgespielt habe,
    bekomme ich einen mekrwürdigen Fehler: strcpy, strcat, memcpy, strcmpi
    und sonstige Befehle sind 'not declared' und CodeBlocks bricht das
    Kompilieren zu meinem Ärgernis ab.
    Dabei bin ich mir zu 10000% sicher, dass es mal ging, ohne irgendwelchr
    anderen Header inkludieren zu müssen.

    Kennt sich mit meinem Problem aus und kann mir helfen??

    Bitte, brauche dringend hilfe.

    P.S.: Auch ein löschen der Config und die Neuinstallation haben nicht geholfen.
    Dabei ging es doch mal ... 😕

    Danke im Voraus



  • Warum ladest du nicht die Header Dateien mit #include<...> ?


  • Mod

    Die sind im Header cstring und funktionieren (in C++) ganz sicher nicht ohne ohne diesen Header einzubinden (oder einen anderen Header, der diese zufällig einbindet, worauf man sich aber nicht verlassen kann). In C++ ist jedoch die Benutzung dieser Funktionen ein ernsthaftes Zeichen, dass du kein C++ machst, sondern C.



  • Es ging doch auch ohne!! Ich kann mich nicht erinnern gelesen zu haben, dass durch irgendein Update jetzt immer irgendwas includen zu müssen, damit ich strcpy benutzen darf.

    Wiesi sollte ich jetzt immer was inkludieren zu müssen. Sry davor genier ich mich ein bisschen... Ich mags nicht so viel includen zu müssen ^^



  • master97 schrieb:

    Es ging doch auch ohne!! Ich kann mich nicht erinnern gelesen zu haben, dass durch irgendein Update jetzt immer irgendwas includen zu müssen, damit ich strcpy benutzen darf.

    Wie SeppJ sagte, kann es zufällig sein, daß durch zum Beispiel <iostream> auch strcpy() deklariert wurde.
    Aber darauf sollte man sich nict verlassen, denn beim nächsten Compiler-Update kanns wieder anders sein.

    master97 schrieb:

    Wiesi sollte ich jetzt immer was inkludieren zu müssen. Sry davor genier ich mich ein bisschen... Ich mags nicht so viel includen zu müssen ^^

    Zur Not schaut man nach und findet:
    http://www.cplusplus.com/reference/clibrary/cstring/strcpy/
    Aha, man muss die <cstring> inkludieren.

    Falls die <iostream> zufällig auch die strcpy deklariert, dann indem sie auch die <cstring> inkudiert. Und morderne Compiler inkludieren so Dateien (mit Includeguard oder "#pragma once") nicht mehrmals, also sparst Du da auch keine Zeit.



  • Sry, mit dem Handy zu antworten ist eine wahre Tortur. Supet lahm das ganze. Danke SeppJ für deine Antwort. Was sollte ich denn stattdessen benutzen? Und wenn du ein Programm in DevC++ erstellst mit folgendem Code

    #include <iostream>
    
    int main() {
        char temp[512];
    
        strcpy(temp, "Hello world!");
        std::cout << temp << "\n";
    
        return 0;
    }
    

    Bin ich mir sicher, dass du kein CString includen musst.

    Wie sieht die c++ Variante denn aus?



  • in C++ nimmt man std::string, ist eine Klasse die sich auch um die Speicherverwaltung kümmert. Du wirst sehen, dass std::string viel leichter zu verwenden ist als C Strings.



  • master97 schrieb:

    Und wenn du ein Programm in DevC++ erstellst mit folgendem Code

    #include <iostream>
    
    int main() {
        char temp[512];
    
        strcpy(temp, "Hello world!");
        std::cout << temp << "\n";
    
        return 0;
    }
    

    Bin ich mir sicher, dass du kein CString includen musst.

    Wie sieht die c++ Variante denn aus?

    Du hast recht was Dev-Cpp bis Version 4.9.9.2 angeht. Und das bezieht sich nicht nur auf den Header cstring , sondern auch auf andere. Bei den Compilern, die Dev-Cpp bis zu dieser Version mitliefert, musste man "fast" gar nichts inkludieren, irgendwo kamen die Header schon her.
    In der Uni mussten wir auch das alte Dev-Cpp nutzen und als ich dann privat auf Visual Studio wechselte, war ich auch erstmal erstaunt, wie viele Header ich zu inkludieren hatte.



  • Das Netz hier im Norden ist echt dreckig. 😞
    Sorry für meine späte Antwort.

    Also erstmal danke an alle 🙂
    Ich werde Wohl, so wies scheint, CString inkludieren müssen.
    Meine Frage war allerdings, warum ich dies neuerdings muss. Es muss eine Einstellung in CodeBlocks sein (ich glaub mein DevC++ Beispiel war blöd), denn es ging. Sonst hätte ich ja nicht dutzende fertige Projekte, wo ich die besagten Funktionen nutze, aber CString nicht inkludiert habe und trotzdem die Binaries erzeugen konnte...
    Ich meine es war irgendne C++00 oder 0x Einstellung. Wer dazu was weiß, kann ja kurz hier Antworten.

    Ansonsten danke und nochwas: ich werd wohl ne eigene String-Klasse schreiben müssen, da viele Funktionen in der C++-String Klasse gar nicht vorhanden sind (bspw. replace o.Ä.).

    Danke nochmal und schönen Abend noch 🙂



  • master97 schrieb:

    ...

    Nene, das liegt einfach daran, dass du vorher ältere Compiler benutzt hast. Richtig ist, wenn du etwas inkludieren musst. Wenn du etwas nicht inkludieren musst, ist es suspekt.



  • master97 schrieb:

    da viele Funktionen in der C++-String Klasse gar nicht vorhanden sind (bspw. replace o.Ä.).

    http://www.cplusplus.com/reference/string/string/replace/
    http://www.cplusplus.com/reference/algorithm/replace/



  • Okok, und wo kann ich das wieder einstellen oder immer automatisch cstring inkludiert wird?



  • warum schreibst du nicht einfach #include <cstring> ?? das ist doch kein aufwand ??außerdem wirst du hier niemand antreffen, der nen kompiler von 2005 (?) benutzt.



  • Hoffentlich nirgendwo. Du programmierst in C++. Im C++-Standard (Definition der Sprache) steht, dass du <cstring> includen solst wenn du strcpy verwenden willst. Selbst wenn es bei dir zufällig (Compilerspezifisches Verhalten) trotzdem ohne ging, solltest du es trotzdem machen. Wenn du irgendwo einstellst, dass es automatisch includiert wird, würde dein Programm nur unter deinen eigenen Compiler-Einstellungen funktionieren, wäre aber generell ein fehlerhaftes Programm.
    Schreib einfach jedes mal #include <cstring> oben hin wenn du strcpy verwenden willst. Bei deinem neuen Programm kannst du das ja auch einfach aus einem vorherigen rüberkopieren. Oder du machst dir irgendeine default.h, in der du alle deine includes machst, und die dann jedes mal includest.
    bzw: Auch ich empfehle dir, dir std::string anzugucken und es dir erstmal nicht weiterhin unnötig schwer zu machen, und mit C-Strings rumzuwurschteln.



  • Dobi schrieb:

    Im C++-Standard (Definition der Sprache) steht, dass du <cstring> includen solst wenn du strcpy verwenden willst.

    Im Standard steht nicht nur, dass du das sollst, sondern dass du das musst. Abgesehen davon heißt es laut C++ Standard std::strcpy() und nicht einfach nur strcpy() 😉

    Dobi schrieb:

    bzw: Auch ich empfehle dir, dir std::string anzugucken und es dir erstmal nicht weiterhin unnötig schwer zu machen, und mit C-Strings rumzuwurschteln.

    +1 👍



  • Ich habe noch nie das Bedürfnis verspürt, strcpy zu verwenden. Kann natürlich auch sein, dass ich einfach nur vergesslich bin, aber das ist eher unwahrscheinlich.


Anmelden zum Antworten