Outils pour utilisateurs

Outils du site


lang:cpp:lieur

Ceci est une ancienne révision du document !


Mangling

Les méthodes template 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.

Si l'implémentation n'est toujours identique, le compilateur va en prendre une au hasard et la généraliser.

Exemple :

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
  }
};
ClasseA.h
#pragma once
 
class A
{
public:
  void go();
};
ClasseB.h
#pragma once
 
class B
{
public:
  void go();
};
ClasseA.cpp
#define HACK
 
#include "Template.h"
#include "ClasseA.h"
 
void A::go()
{
  Entete e;
  e.go(); // On devrait afficher "A".
}
ClasseB.cpp
#undef HACK
 
#include "Template.h"
#include "ClasseB.h"
 
void B::go()
{
  Entete e;
  e.go(); // On devrait afficher "B".
}
main.cpp
#include <iostream>
#include "ClasseA.h"
#include "ClasseB.h"
 
int main()
{
  A a;
  B b;
 
  a.go();
  b.go();
}

Sortie 1 possible :

A
A

Sortie 2 possible :

B
B
lang/cpp/lieur.1573929665.txt.gz · Dernière modification : 2019/11/16 19:41 de root