Fonctions inline et One definition rule.
Bonjour,
Suite à une autre discussion, j'ai fait l'exemple suivant :
a.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| #ifndef A_H_INCLUDED
#define A_H_INCLUDED
struct A
{
static inline void inline_de_A();
};
inline void inline_globale();
void misc();
#endif // A_H_INCLUDED |
a.cpp:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include "a.h"
#include <iostream>
void A::inline_de_A()
{
std::cout<<"inline_de_A dans a.cpp"<<std::endl;
}
void inline_globale()
{
std::cout<<"inline_globale dans a.cpp"<<std::endl;
}
void misc()
{
A::inline_de_A();
inline_globale();
} |
main.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include "a.h"
#include <iostream>
void A::inline_de_A()
{
std::cout<<"inline_de_A dans main.cpp"<<std::endl;
}
void inline_globale()
{
std::cout<<"inline_globale dans main.cpp"<<std::endl;
}
int main()
{
misc();
A::inline_de_A();
inline_globale();
return 0;
} |
Je n'ai aucune erreur à la compilation et au link (Visual&MinGW).
La définition utilisée est à priori celle de main.
Si je supprime les définitions dans main.cpp mais je crée un doublon dans un b.cpp, alors la définition prise est celle de a.cpp.
J'ai le sentiment que le compilateur? linker? supprime toujours une des deux définitions, mais je n'arrive pas à déterminer sur quel critère.
D'où ma question : comment cela s'articule avec le ODR (One Definition Rule) ? Quelle définition est choisie ? Je n'arrive pas à trouver dans la norme ce qui peut répondre à ça.
Merci.