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 demstd
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++.