[Development] QList

Olivier Goffart olivier at woboq.com
Thu Mar 30 08:18:52 CEST 2017


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.

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.

-- 
Olivier

Woboq - Qt services and support - https://woboq.com - https://code.woboq.org




More information about the Development mailing list