2009-11-05 5 views
2

Je me demandais quelles sont les conséquences pour compiler une classe A avec un compilateur qui ne permet pas l'héritage multiple, et compiler une classe B qui le supporte (et la classe B dérivée de la classe A).C++ Séparer les compilateurs pour les classes (vtables)?

Je ne comprends pas vraiment le processus de liaison ... serait-il possible d'utiliser les deux ensemble? Quels sont les inconvénients de l'utilisation de compilateurs séparés dans cette situation, avec vtables? Serait-il impossible que le code utilisant la classe B fonctionne correctement?

Merci.

+0

Il peut se résumer ainsi: Chaque constructeur de compilateur est autorisé à définir son propre ABI. Puisque les différences dans l'ABI rendent le code d'un compilateur inutilisable par un autre, cela rend ces processus inutilisables. Le fait d'utiliser du code compilé avec le même compilateur et des drapeaux différents peut entraîner le même problème (les binaires de débogage et de relâchement ne sont pas compatibles avec certains compilateurs). Donc, techniquement, toutes les unités de compilation devraient être compilées avec le même compilateur en utilisant les mêmes drapeaux (sinon vous demandez des problèmes). –

Répondre

10

En règle générale, ne pas jamais compiler des parties de votre programme C++ avec différents compilateurs.

Différents compilateurs peuvent utiliser, et font souvent, différents schémas de concordance pour l'étape de concordance de symboles, il est donc très improbable que la liaison entre des éléments compilés séparément fonctionne.

Voir doc sur les mutiler name_mangling

+0

En outre, l'implémentation de vtable, la gestion des exceptions, etc. (l'intégralité de l'ABI C++) peut être différente. – sellibitze

+0

Merci pour le heads-up. Je ne ferai jamais ça. – ash

+0

Il est possible de le faire si vous utilisez des objets partagés/DLL. Ensuite, il existe une convention de liaison commune afin que différents compilateurs puissent travailler ensemble. Si vous utilisez une DLL dans votre application à partir d'un fournisseur externe, vous ne savez pas quel compilateur ils ont utilisé. Vous devez diviser votre application en objets/DLL partagés "composant". –

3

disposition d'objets (emplacement du pointeur vtable, le format vtable, le placement sous-objet, etc.) ne sont pas garantis d'être le même entre les compilateurs.

2

Ce ne sont pas seulement les classes qui ne peuvent pas se parler. Les fonctions nues déclarées dans un en-tête mais compilées uniquement par l'un des compilateurs seront invisibles à l'autre compilateur à cause de la gestion des noms.

De plus, toutes les classes/membres statiques de classes compilées par le compilateur qui ne compile pas main() ne s'initialiseront pas correctement car l'exécution de ce compilateur ne sera pas exécutée. Même des choses comme l'arithmétique longue de 64 bits (sur les plates-formes 32 bits) peuvent ne pas être liées correctement à cause des bibliothèques d'exécution conflictuelles.

2

Comme un additif au poste de Arkaitz ci-dessus, vous pouvez trouver d'autres problèmes qui pourraient empêcher le code de travail ensemble des unités de compilation construites avec différents compilateurs:

  1. problèmes de taille de données (par exemple, un compilateur utilise 32 ints bits, les autres 64 bits)
  2. données alignement questions
  3. problèmes avec la mémoire de tas

Fondamentalement partout que les normes C++/C est pas très précis sur les choses Cela laisse une marge pour les différences entre les compilateurs, et donc des problèmes de mélange