Outils pour utilisateurs

Outils du site


lang:cpp:lieur

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:lieur [2019/11/16 19:41] – Ajout d'un exemple pour "Les méthodes template ont un attribut weak" rootlang:cpp:lieur [2023/07/28 09:48] (Version actuelle) – [Mangling] : ajout de "Demangler online" root
Ligne 11: Ligne 11:
 [[http://www.kegel.com/mangle.html|C++ Name Mangling/Demangling]] {{ :lang:cpp:lieur:c_name_mangling_demangling_2019-10-30_16_05_08_.html |Archive du 30/04/2002 le 30/10/2019}} [[http://www.kegel.com/mangle.html|C++ Name Mangling/Demangling]] {{ :lang:cpp:lieur:c_name_mangling_demangling_2019-10-30_16_05_08_.html |Archive du 30/04/2002 le 30/10/2019}}
  
-===Les méthodes template ont un attribut weak===+  * Demangler on-line 
 + 
 +https://d.fuqu.jp/c++filtjs/ 
 + 
 +https://demangler.com 
 +===Les méthodes définies dans un entête ont un attribut weak===
 Le corps d'une méthode ''template'' doit être identique quelque soit le fichier objet généré. Les méthodes ''template'' étant compilés dans chaque fichier objet (possibilité de nombreux doublons), le compilateur va leur donner l'attribut ''weak''. Le corps d'une méthode ''template'' doit être identique quelque soit le fichier objet généré. Les méthodes ''template'' étant compilés dans chaque fichier objet (possibilité de nombreux doublons), le compilateur va leur donner l'attribut ''weak''.
  
 Si l'implémentation n'est toujours identique, le compilateur va en prendre une au hasard et la généraliser. Si l'implémentation n'est toujours identique, le compilateur va en prendre une au hasard et la généraliser.
  
-Exemple : +  * Exemple :
-<file cpp template.h> +
-#pragma once +
- +
-#include <iostream> +
- +
-class Entete +
-+
-public: +
-  void go() +
-  { +
-#ifdef HACK +
-    std::cout << "A" << std::endl; +
-#else +
-    std::cout << "B" << std::endl; +
-#endif +
-  } +
-}; +
-</file> +
-<file cpp ClasseA.h> +
-#pragma once +
- +
-class A +
-+
-public: +
-  void go(); +
-}; +
-</file> +
- +
-<file cpp ClasseB.h> +
-#pragma once +
- +
-class B +
-+
-public: +
-  void go(); +
-}; +
-</file>+
  
-<file cpp ClasseA.cpp+{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/linker/weak/Entete.h}}
-#define HACK+
  
-#include "Template.h" +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/linker/weak/ClasseA.h}}
-#include "ClasseA.h"+
  
-void A::go() +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/linker/weak/ClasseB.h}}
-{ +
-  Entete e; +
-  e.go(); // On devrait afficher "A". +
-+
-</file> +
-<file cpp ClasseB.cpp> +
-#undef HACK+
  
-#include "Template.h" +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/linker/weak/ClasseA.cpp}}
-#include "ClasseB.h"+
  
-void B::go() +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/linker/weak/ClasseB.cpp}}
-{ +
-  Entete e; +
-  e.go(); // On devrait afficher "B". +
-+
-</file> +
-<file cpp main.cpp> +
-#include <iostream> +
-#include "ClasseA.h" +
-#include "ClasseB.h"+
  
-int main() +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/linker/weak/main.cpp}}
-{ +
-  A a; +
-  B b;+
  
-  a.go(); +  * Symboles :
-  b.go(); +
-+
-</file>+
  
-Sortie 1 possible : +{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/linker/weak/ClasseA.cpp.nm}}
-<code> +
-+
-+
-</code>+
  
-Sortie 2 possible : +{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/linker/weak/ClasseB.cpp.nm}}
-<code> +
-+
-+
-</code>+
  
 +On voit que le symbole ''Entete::go()'' est défini deux fois avec l'attribut weak. Mais le ''#define'' étant différent, les deux implémentations sont différentes.
lang/cpp/lieur.1573929665.txt.gz · Dernière modification : 2019/11/16 19:41 de root