#include "functions.hpp"
int main() {
add(2, 2);
return 0;
}
#ifndef FUNCTIONS_HPP
#define FUNCTIONS_HPP
int add(int a, int b);
#endif
#include "functions.hpp"
int add(int a, int b) {
return a + b;
}
Pour compiler :
g++ -o a.out main.cpp functions.cpp
Le compilateur ne prend en entrée que des fichiers .cpp, il les compile un par un en fichiers objet .o qui sont ensuite liés ensemble pour produire un exécutable. Le corps d’une fonction ne doit être défini qu’une fois dans tout l’exécutable, mais pour chaque .cpp qui l’utilise, le compilateur a besoin d’avoir une déclaration de la fonction. Pour ce faire, on inclut un fichier d’en-tête, .h ou .hpp, qui contient une simple déclaration de la fonction, sans son code.
En gros donc les fonctions résident dans les .cpp et les .h/.hpp permettent de faire le lien entre les .cpp et d’indiquer les fonctions qui existent dans le reste de l’exécutable, uniquement leur existence, pas le code correspondant.
Généralement dans un projet tu as un main.cpp, puis des couples de .hpp/.cpp qui correspondent.
Dans un fichier d’en-tête, on entoure le contenu des directives ifndef/define/endif pour s’assurer que le contenu du fichier n’est déclaré qu’une fois lors de la compilation d’un .cpp, même s’il est inclus plusieurs fois, en général indirectement.
Les définitions de types sont à mettre dans les fichiers d’en-tête également.
C’est les bases du C/C++, je te conseille de suivre un tutoriel, tout cela est expliqué.