Comment appeler une fonction à partir d'un autre fichier d'en-tête dans le C++?
J'ai les 3 fichiers suivants (1 *.rpc et 2 *.hpp) :
le fichier de programme principal:
//test.cpp
#include<iostream>
#include"first_func.hpp"
#include"sec_func.hpp"
int main()
{
double x;
x = 2.3;
std::cout << sec_func(x) << std::endl;
}
-
le first_func.php en-tête:
//first_func.hpp
...
double first_func(double x, y, x)
{
return x + y + x;
}
-
le sec_func.php en-tête:
//sec_func.hpp
...
double sec_func(double x)
{
double a, b, c;
a = 3.4;
b = 3.3;
c = 2.5;
return first_func(a,b,c) + x;
}
Comment puis-je l'appeler correctement first_func de l'intérieur de la sec_func.php fichier?
Mettez-vous en oeuvre les fonctions dans les en-têtes de lui-même ? Si oui, c'est mauvais. Ont les déclarations de fonction dans les en-têtes et les mettre en œuvre dans
.cpp
fichiers. Inclure les en-têtes de l'endroit où vous souhaitez utiliser les fonctions et n'oubliez pas de construire tous les fichiers source. Si ce n'est pas le cas pour les modèles de fonction qui n'est pas le cas ici.OriginalL'auteur tagoma | 2012-07-22
Vous devez vous connecter pour publier un commentaire.
C'est une mauvaise pratique de lieu de définition de la fonction de
.hpp
fichiers. Vous devez placer uniquement des prototypes de fonction. Comme ceci:first_func.hpp:
first_func.cpp:
Le même pour la deuxième touche func.
Et puis, où que vous voulez appeler votre
first_func
, vous avez juste à inclure correspondantfirst_func.hpp
dans cecpp
module, et d'écrire à l'appel.Ainsi, chaque module se compose de
hpp
avec l'ensemble des déclarations, etcpp
avec les définitions (le corps). Lorsque vous avez besoin de faire référence à quelque chose à partir de ce module, vous d'inclure seshpp
et utiliser le nom de la constante, une variable, une fonction, peu importe).Et puis vous devez le lier le tout ensemble:
Pas la plus pure explication? 😉
Placer les définitions de fonctions dans les fichiers d'en-tête parfois de sens, surtout si elles sont petites fonctions qui doivent être insérée. Votre fonction signature n'est pas valide en C++. Vous devriez probablement expliquer (ou indice) de la notion de l'unité de traduction. D'autres réponses sont beaucoup mieux, ce qui déclenche probablement les downvotes.
Merci pour C++, la syntaxe de l'indice. Eh bien, dans ce cas, je vais avoir tendance à donner de simples et les mains sur l'explication de quoi mettre où (l'humble niveau d'expérience de l'auteur est évident, d'après le code), que de se plonger dans de petits caractères. Remarque la sélection de l'auteur 🙂
OriginalL'auteur spacediver
Pour la plupart des fonctions, de la mise en œuvre doit résider dans un unité de compilation, qui est un fichier qui va être compilé par lui-même et compilé une fois.
Les en-têtes ne sont pas compilées par eux-mêmes*, au lieu de cela, ils sont inclus par plusieurs unités de compilation.
C'est pourquoi la définition d'une fonction doit résider dans les unités de compilation (comme .rpc), pas dans les en-têtes. Les en-têtes doivent contenir uniquement les déclarations (c'est à dire sans le corps), juste assez pour que les autres unités de compilation ne savent comment les appeler.
Par souci d'exhaustivité, les fonctions doivent être définies dans les en-têtes (une exception) sont:
inline
fonctionsNotes de bas de page:
*
les en-têtes peuvent être réellement pré-compilé, mais c'est une solution pour accélérer la compilation et il n'altère pas leur but; ne pas se confondre.**
vous pouvez mettre du modèle de définition d'une fonction à l'extérieur de l'en-tête si vous utilisez explicite de l'instanciation d'un modèle, mais c'est un cas rare; le point important est que chaque unité de compilation qui veut instancier un modèle (appliquer arguments pour elle) doit avoir sa définition complète, c'est pourquoi la fonction de modèle définitions aller dans les en-têtes de trop.OriginalL'auteur Kos
De définir une fonction dans un en-tête, vous devez marquer
inline
pour éviter de multiples définitions.Si vous voulez faire cela, au lieu de séparer la mise en œuvre d'un fichier séparé, vous aurez besoin de fournir un prototype avant l'appel de la fonction (y compris l'en-tête (de préférence) ou la déclaration de la fonction vous-même).
J'ai juste listé les deux alternatives, moi aussi, je préfère y compris l'en-tête.
OriginalL'auteur Luchian Grigore