Guillemets standard C++
En Projet de norme C++17 N4659 10.1.6 "The inline specifier" dit que les méthodes sont implicitement inline :
4 Une fonction définie dans une définition de classe est une fonction en ligne.
et plus loin, nous voyons que les méthodes en ligne peuvent non seulement, mais aussi doit être défini sur toutes les unités de traduction :
6 Une fonction ou une variable inline doit être définie dans chaque unité de traduction dans laquelle elle est utilisée de manière odr et doit avoir exactement la même définition dans tous les cas (6.2).
Ceci est également mentionné explicitement dans une note au point 12.2.1 "Fonctions des membres" :
1 Une fonction membre peut être définie (11.4) dans sa définition de classe, auquel cas il s'agit d'une fonction membre en ligne (10.1.6) [...]
3 [ Note : Il peut y avoir au maximum une définition d'une fonction membre non-inline dans un programme. Il peut y avoir plus d'une définition de fonction membre inline dans un programme. Voir 6.2 et 10.1.6. - fin de la note ]
Mise en œuvre de GCC 8.3
main.cpp
struct MyClass {
void myMethod() {}
};
int main() {
MyClass().myMethod();
}
Compiler et visualiser les symboles :
g++ -c main.cpp
nm -C main.o
sortie :
U _GLOBAL_OFFSET_TABLE_
0000000000000000 W MyClass::myMethod()
U __stack_chk_fail
0000000000000000 T main
alors nous voyons de man nm
que le MyClass::myMethod
est marqué comme faible sur les fichiers objets ELF, ce qui implique qu'il peut apparaître sur plusieurs fichiers objets :
"W" "w" Le symbole est un symbole faible qui n'a pas été spécifiquement marqué comme un symbole objet faible. Lorsqu'un symbole faible défini est lié à un symbole défini normal, le symbole défini normal est utilisé sans erreur. Lorsqu'un symbole faible non défini est lié et que le symbole n'est pas défini, la valeur du symbole est déterminée de manière spécifique au système, sans erreur. Sur certains systèmes, les majuscules indiquent qu'une valeur par défaut a été spécifiée.