Ce que vous voyez est l'utilisation de inline espaces de noms pour atteindre ABI gestion des versions.
Ce que cela signifie:
La libstdc++ std::string
est une autre structure de données de la libc++ std::string
. Le premier est une référence compté de la conception, tandis que le second ne l'est pas. Bien qu'ils soient API compatibles, ils ne sont pas ABI compatible. Cela signifie que si vous construisez un std::string
avec libstdc++, puis passer à un autre code qui est lié à l'encontre de la libc++, le code de la réception pourrait penser qu'il a une libc++ std::string
. I. e. le récepteur n'aurait pas la moindre idée qu'il faut incrémenter ou décrémenter le nombre de références.
Sans inline espaces de noms, le résultat serait une erreur d'exécution. Le mieux qu'on pouvait espérer, c'est un accident. Avec inline espaces de noms cette erreur se traduit par un temps de lien d'erreur.
Pour vous le programmeur de la libstdc++ std::string
et la libc++ std::string
ressembler à un même type. Mais à l'éditeur de liens, ils ressemblent complètement différents types (l'indice est l' std::__1
d'espace de noms). Et l'éditeur de liens de vue est correct. Ils sont complètement différents types.
Donc, oui, vous pouvez manipuler certains préprocesseur indicateurs pour obtenir des choses de lien. Mais alors, vous auriez un diable d'un temps à mettre au point la résultante de l'exécution de bugs.
La seule façon de faire ce que vous voulez est de faire l'interface entre ces dylibs pas impliquer std::types
comme string
. Par exemple, vous pourriez passer des tableaux de char
à la place. Vous pouvez même transférer de la mémoire de la propriété de la bibliothèque libstdc++-lié code de la libc++liés code et vice-versa (ils seront à la fois de tomber à travers la même fonction malloc de la piscine).