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?
/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
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 entsprechendencname
-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
), was die ganze Unterscheidung zwischen diesen Headern eher ... unbrauchbar macht, wirklich.
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 Headerscname
gleich sein wie die des entsprechenden Headersname.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 Namensraumsstd
. 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 ...
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.