help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Does cstdlib pollute the global namespace?


From: Jeff Schwab
Subject: Re: Does cstdlib pollute the global namespace?
Date: Thu, 18 Oct 2007 13:06:37 -0700
User-agent: G2/1.0

On Oct 18, 12:07 pm, Pedro LamarĂ£o <pedro.lama...@gmail.com> wrote:
> On Oct 18, 2:58 pm, Jeff Schwab <j...@schwabcenter.com> wrote:
>
>
>
> > Is the following error message correct?  It seems like system() ought
> > to be in the ::std namespace.  What am I missing?
>
> >     // main.cc
> >     #include <cstdlib>
> >     namespace system { }
>
> >     $ g++ -ansi -pedantic -Wall -c main.cc
> >     main.cc:3: error: 'namespace system { }' redeclared as different
> > kind of symbol
> >     /usr/include/stdlib.h:738: error: previous declaration of 'int
> > system(const char*)'
> >     make: *** [main.o] Error 1
>
> > My current work-around is an unnamed "wrapper" namespace:
>
> >     namespace { namespace system { } }
>
> This behaviour is alloweb by the Standard.
>
> In the section [headers] paragraph 4 of the current draft we read:
>
> "Except as noted in clauses 18 through 27 and Annex D the contents of
> each header cname shall be the same as that of
> the corresponding header name.h, as specified in the Standard C99
> Library (1.2) or the C Unicode TR, as appropriate, as
> if by inclusion. In the C++ Standard Library, however, the
> declarations (except for names which are defined as macros
> in C) are within namespace scope (3.3.5) of the namespace std. It is
> unspecified whether these names are first declared
> within the global namespace scope and are then injected into namespace
> std by explicit using-declaration s (7.3.3)."
>
> That last sentence means the compiler is allowed to declare these
> names in the global namespace.
>
> I don't have the current Standard around to check if the same language
> is in place, but I believe it to be so.

Thank you.  I had no idea this was allowed.

Any suggestions for work-arounds better than wrapping my own header
contents in an unnamed namespace are welcome.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]