Namespace-Probleme in C ++ 11?

8

Kann jemand bitte folgendes erklären:

%Vor%

Sollte das div Symbol nicht in std Namespace auch für den C ++ 11 Modus sein? Oder ist es etwas bestimmtes für mein System?

    
Tomasz Grobelny 23.10.2012, 22:11
quelle

3 Antworten

4
  

/usr/include/stdlib.h

Jeder Name in einem Header .h C stdlib befindet sich (offensichtlich) im globalen Namespace.

Darüber hinaus definiert jeder cHEADER C ++ - stdlib-Header die entsprechenden Namen aus HEADER.h im Namespace std , darf aber auch im globalen Namespace enthalten sein (damit sie einfach

ausführen können) %Vor%

und fertig damit sein.

§D.5 [depr.c.headers]

  

p2 Jeder C-Header, von denen jeder den Namen name.h hat, verhält sich so, als würde jeder Name, der durch den entsprechenden cname -Header im Standard-Bibliotheksnamensraum platziert wird, innerhalb des globalen Namensraumbereichs platziert. Es ist nicht spezifiziert, ob diese Namen zuerst im Namespace-Bereich (3.3.6) des Namespace std deklariert oder definiert werden und dann durch explizite using-Deklarationen (7.3.3) in den globalen Namespace-Bereich injiziert werden.

     

p3 [ Beispiel: Der Header <cstdlib> stellt seine Deklarationen und Definitionen sicher innerhalb des Namespace std zur Verfügung. Sie können diese Namen auch im globalen Namespace angeben. Der Header <stdlib.h> stellt sicher dieselben Deklarationen und Definitionen im globalen Namespace bereit, ähnlich wie im C-Standard. Es kann diese Namen auch im Namespace std bereitstellen. -Endbeispiel ]

Wie Sie sehen, ist das auch umgekehrt der Fall ( <HEADER.h> kann Namen in den Namensraum std einfügen, als ob

%Vor%

), was die ganze Unterscheidung zwischen diesen Headern eher ... unbrauchbar macht, wirklich.

    
Xeo 23.10.2012, 22:25
quelle
3

div ist eine Funktion von <stdlib.h> .

In C ++ 11 durften die Header <c blah > Sachen im globalen Namespace platzieren.

  

C ++ 11 §17.6.1.2 / 4 :
  "Außer wie in den Abschnitten 18 bis 30 und Anhang D angegeben, muss der Inhalt jedes Headers cname gleich sein   wie die des entsprechenden Headers name.h , wie in der C-Standardbibliothek (1.2) oder dem C-Unicode-TR angegeben, je nach Bedarf, wie durch Einschluss. In der C ++ - Standardbibliothek sind die Deklarationen (außer für   Namen, die in C) als Makros definiert sind, befinden sich im Namensraumbereich (3.3.6) des Namensraums std . Es ist   Unbekannt, ob diese Namen zuerst im globalen Namespace-Bereich deklariert und dann injiziert werden   in namespace std durch explizite using-declarations (7.3.3). "

Bezieht sich auf die Realität gängiger C ++ - Implementierungen.

Also hat sich nichts wirklich geändert, außer dem formellen: dass das Verhalten, das Sie sehen, jetzt vom Standard sanktioniert wird, anstatt ein Implementierungsartefakt zu sein, das man berücksichtigen sollte.

Außerdem macht es die formale Änderung einfacher, über SO zu streiten, dass man besser .h headers als c xxx Header hinzufügen sollte ...

    
Cheers and hth. - Alf 23.10.2012 22:21
quelle
1

17.6.4.3.3 / 1 besagt:

  

Jeder Name, der als Objekt mit externer Verknüpfung in einem Header deklariert ist, ist für die Implementierung reserviert, um das Bibliotheksobjekt mit externer Verknüpfung, 182 , sowohl im Namespace std als auch im globalen Namespace zu bezeichnen / p>

div ist ein Name, der als Funktion mit externer Verknüpfung im Header cstdlib deklariert wurde und daher ein reservierter Name im globalen Namespace ist. Sie dürfen diesen Namen nicht verwenden.

    
bames53 23.10.2012 22:54
quelle

Tags und Links