[Development] QList

Olivier Goffart olivier at woboq.com
Thu Mar 30 08:41:51 CEST 2017


On Donnerstag, 30. März 2017 08:32:24 CEST Marc Mutz wrote:
> On Thursday 30 March 2017 08:18:52 Olivier Goffart wrote:
> > On Donnerstag, 30. März 2017 07:20:11 CEST Marc Mutz wrote:
> > > On Wednesday 29 March 2017 22:12:30 Thiago Macieira wrote:
> > > > On quarta-feira, 29 de março de 2017 11:11:58 PDT Marc Mutz wrote:
> > > > > Keyword: inline namespaces. This is the C++ mechanism for API
> > > > > versioning. It allows to make that totally transparent. Why you find
> > > > > that so odd as to be lacking for words is beyond me.
> > > > 
> > > > Inline namespaces do not solve the binary compatibility problem. They
> > > > should not be used in Qt API for versioning.
> > > > 
> > > > Instead, do what you said before: create a V2 class.
> > > 
> > > Since the two are totally identical, except that inline namespaces are
> > > transparent to the user, please explain what leads you to this
> > > distinction.
> > 
> > Library 1:
> >  inline namespace v1 { class Foo {}; }
> > 
> > Library 2:
> >  LIBRARY2_EXPORT void registerPlugin(Foo*);
> >     -> symbol gets mangled as "registerPlugin(v1::Foo*)"
> > 
> > Application:
> >   registerPlugin(new Foo);
> >      -> calls exported symbol "registerPlugin(v1::Foo*)"
> > 
> > When Library 1 puts Foo in the v2 inline namespace,  recompile Library2
> > and
> > the exported symbol becomes "registerPlugin(v2::Foo*)". If Application is
> > not recompiled, it will not work as the old symbol is no longer found.
> 
> Well, of couse. That's like removing the QFoo overload when you add QFooV2.
> Don't do that. You need to keep the v1::Foo definition as well as the
> v1::Foo overload, just as you need to keep the QFoo definition and the QFoo
> overload, when you add v2.

What I meant is that Library 1 becomes, in its next version

 namespace v1 { class Foo{}; }
 inline namespace v2 { class Foo{}; }

It keeps  v1::Foo,  but puts v2::Foo in the inline namespace.

If you don't use "inline namespace v2", that means users needs to explicitly 
use v2::Foo to use the new features. So it is no longer "transparent to the 
user"

Personally I prefer having a pimpl so I can just add or change members.

(Note that if the class is at least sizeof(void*) and that none of its member 
are accessed in inline methods or ctors/dtor, we can add a pimpl later, when 
we need it.)

> > So what that means is that technically, Library 1 did not break its binary
> > compatibility.  But any library using Library 1 in their ABI is breaking
> > compatibility when they get recompiled.
> > 
> > GCC's ABI tag extension have the exact same problem.





More information about the Development mailing list