Maison >développement back-end >C++ >Pouvez-vous définir des fonctions membres en ligne dans les fichiers .cpp ? Un regard sur les inclusions circulaires et le comportement du compilateur.
Définir les fonctions membres en ligne dans les fichiers .cpp : une énigme
Alors que les fonctions membres en ligne sont généralement placées dans des en-têtes pour être incluses directement lors de la compilation, certains scénarios nécessitent leur implémentation dans des fichiers .cpp. Un de ces cas concerne les inclusions circulaires, où l'implémentation d'une fonction membre en ligne doit être définie dans un fichier .cpp.
Dilemme des inclusions circulaires
Considérez l'exemple suivant :
A.h
<code class="cpp">#pragma once #include "B.h" class A { B b; };</code>
B.h
<code class="cpp">#pragma once class A; // forward declaration class B { inline A getA(); };</code>
B.cpp
<code class="cpp">#include "B.h" #include "A.h" inline A B::getA() { return A(); }</code>
Dans cette situation, en raison de l'inclusion circulaire entre A.h et B.h, l'implémentation de la fonction membre en ligne getA() doit être définie dans B.cpp. Cependant, cela soulève une question fondamentale :
Le compilateur en ligne obtiendra-t-il A() correctement ?
Non. Le compilateur n'intègre une fonction que lorsque sa définition est disponible au point d'utilisation. Dans l'exemple ci-dessus, la définition de getA() n'est pas visible lorsqu'elle est appelée à partir d'autres fichiers .cpp, ce qui entraîne une erreur « externe non résolue » lors de la liaison.
Importance des mots-clés en ligne
Seul le mot-clé inline présent dans la définition en dehors du corps de la classe (dans B.cpp dans ce cas) est significatif. Le mot-clé en ligne dans l'en-tête (en B.h) sert de déclaration, indiquant que l'implémentation sera fournie ailleurs.
Approche alternative pour définir les fonctions membres en ligne dans les fichiers .cpp
Actuellement, il n'existe aucune méthode alternative pour définir les fonctions membres en ligne dans les fichiers .cpp. La norme exige que leur définition soit placée dans les en-têtes pour une expansion en ligne appropriée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!