Bonjour,
Suite à une autre discussion, j'ai fait l'exemple suivant :
a.h
a.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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_INCLUDEDmain.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }Je n'ai aucune erreur à la compilation et au link (Visual&MinGW).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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.
Partager