Static linkage and anonymous namespace

Martin von Loewis martin@mira.isdn.cs.tu-berlin.de
Sun Aug 30 23:25:00 GMT 1998


>   But why can't we just make the definitions have internal linkage if
> they're in an anonymous namespace?  Why do we need to introduce the
> TREE_PRIVATE bit?  In other words, at some point the compiler decides
> whether to make things have internal or external linkage.  Why doesn't
> it just use the DECL_CONTEXT (recursively looking at parent contexts)
> to see what linkage the thing should get?

Good questions. As far as I can tell, there are two reasons:

1. Not all members of an anonymous namespace can have internal
   linkage. Specifically, foo in

   namespace{
     extern "C" foo(){}
   }

   can be called from other translation units. This is because of the
   way anonymous namespaces and C linkage are defined. Maybe this is
   really a defect, maybe this is intentional.

2. Some members of named namespaces also get this internal linkage.
   Given

   namespace {
     struct Foo{};
   }

   we get this on

   void print(Foo&){}
   std::vector<Foo> vfoo;

   Other translations can't use these objects/functions, since they
   can't provide the parameters. Not making them internal means to
   risk linkage problems again, if some other translation unit has the
   same sequence of tokens.

   I started computing whether an object is related to anonymous
   namespaces, i.e. analyze template parameters and argument types.  I
   then realized that I reimplemented the mangling algorithm.

So, I think the current patch does exactly what it is supposed to do:
all assembler names that contain the supposedly unique anonymous
namespace name should have internal linkage.

Maybe the implementation of that is messy; I'll take advise on how to
improve it.

Martin



More information about the Gcc-patches mailing list