Rozsah C knihovny v jazyce C ++ - <Xh> vs <cX>

hlasů
5

C ++ Programming Language: Special Edition uvádí na straně 431, která je ...

For every header < X.h > defining part of the C standard library in the global namespace and also in namespace std, there is a header < cX > defining the same names in the std namespace only.

Nicméně, když jsem použít C hlavičky v <cX> stylem, nepotřebuji se kvalifikovat oboru názvů. Například...

#include <cmath>
void f() {
  double var = sqrt( 17 );
}

To by sestavit v pořádku. I když ta kniha říká, že pomocí <> cX záhlaví definuje jmen pouze std názvů je povoleno používat tyto názvy bez Kvalifikační jmenný prostor. Co jsem zde chybí?

PS Použití GNU.GCC kompilátor

Položena 22/01/2010 v 16:48
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
9

Stephan T. Lavavej, člen týmu MSVC, řeší realitu této situace (a některé z úprav na standard) v tomto komentáři k jedné z jeho blog vyslání ( http://blogs.msdn.com/vcblog/ archiv / 2008/08/28 / the-mallocator.aspx # 8904359 ):

> Vám <cstddef>, <cstdlib>a std::size_tetc by měly být použity!

Použil jsem být velmi opatrný na to. C ++ 98 měl skvělý sen, vyznačující se tím <cfoo> vyhlásí všechno uvnitř prostoru jmen std, a <foo.h>by zahrnoval <cfoo>a přetažením všechno do globálního prostoru jmen s použitím-prohlášení. (To je D.5 [depr.c.headers]).

To byl ignorován mnoha realizátorů (z nichž některé měly velmi malou kontrolu nad záhlaví C Standard Library). Takže, C ++ 0x byla změněna tak, aby odpovídala realitě. Jak pracovní dokument N2723, http://open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2723.pdf , nyní <cfoo>je zaručeno, že prohlásit všechno uvnitř namespace std, a mohou nebo nemusí prohlásit věci v rámci globální názvů. <foo.h>je opak: to je zaručeno, že prohlásit, co bylo v globálním jmenném prostoru, a mohou nebo nemusí prohlásit věci v prostoru jmen std.

Ve skutečnosti a v jazyce C ++ 0x, včetně <cfoo>není pojistkou proti všemu stále deklarována v globálním jmenném prostoru kdekoli. To je důvod, proč jsem přestal obtěžovat <cfoo>.

To byla knihovna Vydání 456, http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456 .

(C ++ 0x stále kritizuje v <foo.h>záhlaví z C standardní knihovny, který je veselý.)

Jsem 100% souhlas s Lavavej, kromě Nikdy jsem se snažil být velmi opatrní o použití <cfoo>záhlaví stylu, i když jsem poprvé začal používat C ++ - standardní ty C byly prostě příliš zakořeněné - a nikdy nedošlo skutečný svět problém s použitím jejich (a zřejmě nikdy nedošlo skutečný svět přínos pomocí <cfoo>záhlaví styl).

Odpovězeno 22/01/2010 v 17:28
zdroj uživatelem

hlasů
6

Pravidlo pro knihovny C se liší od C ++ knihovny pro obory názvů

gcc interpretuje standard v GCC dokumentů jako

Norma stanovuje, že pokud jedna obsahuje hlavičku C-stylu (<math.h> v tomto případě), symboly budou k dispozici v globálním jmenném prostoru a možná i v prostoru jmen std :: (ale to už není firma požadavek.) na druhé straně, včetně C ++ - styl záhlaví (<CMATH>) zaručuje, že subjekty budou nalezeny v prostoru jmen std a snad i v globálním jmenném prostoru.

V návrhu C0X ++ spec se píše v kapitole 17.6.2.3 záhlaví

Je NS, zda tyto názvy jsou nejprve deklarována v rámci globálního jmenného prostoru a potom se vstříkne do prostoru jmen std explicitními s použitím prohlášeních

Odpovězeno 22/01/2010 v 17:03
zdroj uživatelem

hlasů
4

Je těžké to opravit, aniž by se provádí knihovnu C dvakrát. Viz DR 456 , který v podstatě navrhuje vzdát na problém.

Odpovězeno 22/01/2010 v 17:03
zdroj uživatelem

hlasů
1

Proč říkáte „To by sestavit v pořádku“, když to porušuje standard? Který umožňuje používat tyto názvy bez Kvalifikační jmenný prostor? Už jste testovali to na konkrétní realizaci a zjistil, že to funguje?

I radím před používáním nějaké konkrétní nestandardní funkce, protože se to stane pracovat na své kompilátor volby. Takové věci snadno zlomit, snad s novější verzí stejného kompilátoru.

Odpovězeno 22/01/2010 v 16:54
zdroj uživatelem

hlasů
0

Pravděpodobně chybí pomocí standardů konformní kompilátor (nebo ten, který používají je nakonfigurován tak, aby byl kompatibilní s pre-standard kód).

Odpovězeno 22/01/2010 v 16:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more