memset wird nicht mehr gefunden?!
-
ich wollte mal mein programm nach langer zeit wieder übersetzen, allerdings macht mir der compiler probleme.
annet.cpp:99: error: ‘memset’ was not declared in this scope
weis jemand warum diese komische meldung kommt? normalerweise ist doch memset st-mäßig mit in c dabei?!
-
Zeig mal bitte deinen Quelltext und hast du auch mit
#include <string.h>
den Header eingebunden? Abgesehen davon, ist memset() nicht eh eine C-Funktion?
-
MSDN schrieb:
function memset requires: <memory.h> or <string.h>
bb
-
Berufspenner schrieb:
Abgesehen davon, ist memset() nicht eh eine C-Funktion?
Jo,aber das sollte dir doch bewusst sein, wenn du string.h includest.
http://www.cplusplus.com/reference/clibrary/cstring/memset.html
-
Unter C++ bitte aber den Header <cstring> nehmen
-
drakon schrieb:
Berufspenner schrieb:
Abgesehen davon, ist memset() nicht eh eine C-Funktion?
Jo,aber das sollte dir doch bewusst sein, wenn du string.h includest.
http://www.cplusplus.com/reference/clibrary/cstring/memset.htmlIch weiß, ich weiß
Und die Seite kam auch gleich als erstes Ergebniss, als ich die "allumfassende Kristalkugel" Google befragt habe
Aber da ich die Funktion noch nicht kenne und es ja <string> und <string.h> gibt und ich dazu noch keine korrekten Aussagen treffen kann, wollte ich lieber auf Nummer sicher gehn
-
Nexus schrieb:
Unter C++ bitte aber den Header <cstring> nehmen
Dann liegt die Funktion im namespace std.
(Nur als Hinweis gedacht.)
Simon
-
simon.gysi schrieb:
Dann liegt die Funktion im namespace std.
Nein, die Funktionen der C-Standardbibliothek bleiben weiterhin im globalen Namensraum. Das gilt für
memset()
gleich wie C-String-Funktionen (z.B.strcpy()
) und C-Math-Funktionen (z.B.sin()
). Der Namensraumstd
ist dem C++-Teil der Standardbibliothek vorbehalten.
-
Nexus schrieb:
Nein, die Funktionen der C-Standardbibliothek bleiben weiterhin im globalen Namensraum. Das gilt für
memset()
gleich wie C-String-Funktionen (z.B.strcpy()
) und C-Math-Funktionen (z.B.sin()
). Der Namensraumstd
ist dem C++-Teil der Standardbibliothek vorbehalten.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.
-
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!!!