memset wird nicht mehr gefunden?!



  • 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 Namensraum std 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


  • Mod

    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 unter std:: 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 unter std:: 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 innerhalb std 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!!!


Anmelden zum Antworten