sprintf, memset, atoi in C++



  • Hey,

    wenn ich die oben genannten C Funktionen bzw. andere C Funktionen nutze, muss ich dann std:: davorschreiben? Unter Windows (MSVC) und Linux (Code::Blocks, GCC) läuft es auch ohne std:: davor. Das verunsichert mich.

    Ist es also notwendig?



  • Wenn du den Namespace-Qualifizierer std auslässt, würdest du AFAIK die echten C-Funktionen aus der C-Stdlib aufrufen. Mit dem std davor sind es dann die Funktionen aus der C-Untermenge von C++.



  • Du musst std:: davor setzen, wenn du die richtigen Header benutzt.

    Falsch: string.h
    Richtig: cstring



  • Binde ich cstring nicht ein, so findet er diese Funktion nicht. Binde ich es ein, so funktionieren beide Varianten (mit und ohne std::). Das ist das mysteriöse.



  • Du machst was falsch.



  • Nein das ist richtig so, denn cstring includiert die string.h und "zieht" die C-Funktionen einfach in den std-namespace, mehr macht es nicht.

    Dennoch wäre es ratsam in C++ die cstring einzubinden und immer den std-namespace zu nutzen, denn wer weiß, irgendwann wird die strcpy C-Funktion einmal gegen eine andere, bessere(?), Funktion ausgetauscht die dann aber nur im std-namespace definiert wird, dann wäre aber garantiert das Du immer die "aktuelleste" Funktion benutzt.

    Gut Schuß
    VuuRWerK 😉



  • Janjan schrieb:

    Du machst was falsch.

    Nein, das kann so sein, da cstdlib möglicherweise ein "#include <stdlib.h>" enthält.

    Der gcc 4.4.1 auf Linux macht es z.B. so.

    Lars



  • manni66 schrieb:

    Janjan schrieb:

    Du machst was falsch.

    Nein, das kann so sein, da cstdlib möglicherweise ein "#include <stdlib.h>" enthält.

    Der gcc 4.4.1 auf Linux macht es z.B. so.

    Wie die einzelnen Compiler/Standardbibliotheken das handhaben ist ihre Sache. Es ist allerdings so, dass das Vorhandensein der C-Header (stdlib.h etc.) vom C++-Standard nicht garantiert wird, lediglich die entsprechenden C++-Header (<cstdlib> etc.) sind garantiert. Und für diese ist eben nur garantiert, dass die Funktionen im std::namespace vorhanden sind. Die C-Header zu benutzen oder sich darauf zu verlassen, dass die C++-Header die Funktionen auch im globalen namespace definieren, mag also zwar oft funktionieren, ist aber nicht portabel und kein gültiges Standard-C++.


Log in to reply