memset wird nicht mehr gefunden?!
-
dgrat schrieb:
normalerweise ist doch memset st-mäßig mit in c dabei?!
du sagst es - C. was versuchst du C-mäßiges anzstellen dass du eine C-Funktion verwendest, statt das Ganze mit C++-Mitteln zu lösen? Sicher dass du im richtigen Forum gelandet bisf?
-
LordJaxom schrieb:
Da bist Du leider falsch informiert. Die <cxxx> Header, die die <xxx.h> Header der C-Bibliothek ersetzen, holen alles auf der C-Bibliothek (bis auf Makros natürlich) in den Namensraum std.
Danke für die Berichtigung. Wenn ich das allerdings bei Visual C++ 2008 Express ausprobiere, sind die C-Funktionen weiterhin im globalen Namensraum anzutreffen...
Was stimmt jetzt?
-
Das liegt an der Implementierung. Der Standard schlägt imho vor die C-Header so zu implementieren (hier am Beispiel von string.h)
// string.h #include <cstring> // hier ist std::memset using std::memset; // std::memset global verfügber machen.
Die Visual C++ Implementierung von cstring sieht wie folgt aus:
// cstring #include <string.h> namespace std { using ::memset; }
Es wird also umgekehrt gemacht. Das macht es möglich, die selben Headerdateien für C und C++ zu benutzen. Hat aber den Nachteil, dass in den C++ Headerdateien die Funktionen immer in zwei Namespaces (global, std) bekannt sind.
Gruß
Don06
-
Nexus schrieb:
LordJaxom schrieb:
Da bist Du leider falsch informiert. Die <cxxx> Header, die die <xxx.h> Header der C-Bibliothek ersetzen, holen alles auf der C-Bibliothek (bis auf Makros natürlich) in den Namensraum std.
Danke für die Berichtigung. Wenn ich das allerdings bei Visual C++ 2008 Express ausprobiere, sind die C-Funktionen weiterhin im globalen Namensraum anzutreffen...
Was stimmt jetzt?
Es ist unspezifiziert, ob die Funktionen der C-Standardbibliothek auch bei Benutzung der C++-Header zusätzlich zur Deklaration im Namensraum std auch im globalen Namensraum sichtbar werden. Die entsprechenden Bezeichner bleiben im globalen Namensraum weiterhin reserviert.
-
Also, ich habs jetzt nochmals ausprobiert,
std::memset()
geht tatsächlich. Es hat mich ein bisschen verwirrt, weil im IntelliSense unterstd::
nur die C++-Funktionen und -Klassen angezeigt werden. Trotzdem ist das eine unnötige Verschmutzung des globalen Namensraumes.
-
Nexus schrieb:
Also, ich habs jetzt nochmals ausprobiert,
std::memset()
geht tatsächlich. Es hat mich ein bisschen verwirrt, weil im IntelliSense unterstd::
nur die C++-Funktionen und -Klassen angezeigt werden. Trotzdem ist das eine unnötige Verschmutzung des globalen Namensraumes.Du weißt aber schon, dass die Funktionen der C Standard Library ebenso zum C++ Standard gehören und somit auch ihren Platz im namespace std verdient haben?
std::exit, std::memset und std::strncpy gehören genauso zum C++ Standard wie die Containerklassen und Algorithmen der STL.
-
Ja, dass die Funktionen zum Standard gehören, war mir schon bewusst (was sollten sonst die <cxxx>-Header?), aber nicht, dass sie auch in dessen Namensraum stehen. Gerade weil man die Bezeichner (zumindest bei mir) auch ausserhalb von
std
, also im globalen Namensraum, verwenden kann und IntelliSense wie gesagt keinen Hinweis auf ein Vorkommen innerhalbstd
liefert.
-
Nexus schrieb:
...auch ausserhalb von
std
, also im globalen Namensraum, verwenden kann...Ja, das sind aber soweit ich weiß nur legacy Gründe.
-
Xantus schrieb:
Du weißt aber schon, dass die Funktionen der C Standard Library ebenso zum C++ Standard gehören und somit auch ihren Platz im namespace std verdient haben?
Dass die C-Funktionen zum C++ Standard gehören ist natürlich wahr (imho LEIDER) - wodurch sie sich den Platz dort verdient haben sollen ist mir indes schleierhaft - das Standard Comittee hat so entschieden, ok. Dass das alles nur aus Gründen der Rückwärtskompatibilität geschehen ist sollte aber jedem im Hinterkopf bleiben. Dinge wie printf sind Bestandteil des C++-Standard, es sollte aber niemand davon ausgehen, sowas ernsthaft in einem C++-Programm zu verwenden.
jemand* in Xing.com schrieb:
So wie auf unseren Straßen auch noch Kutschen fahren können.
Man bedenke allein die grobe Fahrlässigkeit in Punkto Typsicherheit und Speicherlecks, die von C-Funktionen in C++-Programmen häufig begangen wird...
___________________________________
*wer sich wiedererkennt kann sich ja mal melden
-
was mich verwirrt hat, ist, dass ich bei den lib64 bibs keine string oder memory *h includen brauchte. KOMISCH!!!