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.

Pouvez-vous définir des fonctions membres en ligne dans les fichiers .cpp ? Un regard sur les inclusions circulaires et le comportement du compilateur.

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 14:03:52546parcourir

 Can You Define Inline Member Functions in .cpp Files? A Look at Circular Includes and Compiler Behavior.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn