Inclusions de fichiers

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Alors voilà, je vais essayer d'être le plus claire possible.

En C j'ai :

  • Un fichier "fonctions.c" auquel est inclus son en-tête "fonctions.h"
  • Un fichier "main.c" sans aucun en-tête inclus

Lorsque je lance la compilation, ça fonctionne parfaitement.

En C++, j'ai :

  • Un fichier "fonctions.cpp" auquel est inclus son en-tête "fonctions.h"
  • Un fichier "main.cpp" sans aucun en-tête inclus

Lorsque je lance la compilation, ça ne fonctionne pas du tout. Il faut que j'inclus forcément l'en-tête de "fonction.h" dans le main.

PS : J'utilise les fonctions de "fonctions.c/cpp" dans les main.

Je souhaite savoir pourquoi cette différence.

Merci d'avance !

Édité par john.doe

+0 -0

Salut, tu compile avec quoi ? un IDE, un makefile ou "à la main" ?

Ton erreur est-elle bien à l'édition des liens ? Si c'est à la compilation, le problème doit être ailleurs.

Si tu utilises dans "main.c" des fonctions définies dans "fonctions.c", il faut forcément inclure "fonctions.h", que ce soit en C ou en C++.

+0 -0
Auteur du sujet

J'ai essayé de compiler avec un IDE (NetBeans) et à la main :

Pour C :

1
gcc fonctions.c main.c -o app.exe

Pour C++ :

1
g++ fonctions.cpp main.cpp -o app.exe

Le résultat reste le même. En C, lorsque je n'inclus pas l'en-tête dans le main ça fonctionne. En C++ ça ne fonctionne pas du tout.

EDIT : Je viens de réaliser que si je compile avec g++ :

1
g++ fonctions.c main.c -o app.exe

Ça ne fonctionne pas du tout. Il faut effectivement que j'inclus les en-têtes dans le main.

Le problème viendrait donc de gcc et g++. gcc accepte que je ne mette pas d'en-têtes dans le main.c et g++ refuse.

Édité par john.doe

+0 -0
Auteur du sujet

Le message d'erreur que j'ai eu lorsque je compilais avec g++ :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
main.c: In function 'int main()':
main.c:9:50: error: 'addition' was not declared in this scope
     printf ("%d + %d = %d\n", a, b, addition(a, b));
                                                  ^
main.c:10:54: error: 'soustraction' was not declared in this scope
     printf ("%d - %d = %d\n", a, b, soustraction(a, b));
                                                      ^
main.c:11:56: error: 'multiplication' was not declared in this scope
     printf ("%d * %d = %d\n", a, b, multiplication(a, b));
                                                        ^
main.c:12:50: error: 'division' was not declared in this scope
     printf ("%d / %d = %f\n", a, b, division(a, b));
                                                  ^

Avec gcc, aucun message d'erreur.

+0 -0

C'est pas la faute à g++, mais au C. Ce dernier est laxiste et essaie de deviner pour nous à quelle fonction on cherche à faire référence. Le C++ demande de la rigueur et ne parle pas à des fonctions qu'on ne lui a pas présenté. Qui dit que c'est une fonction d'ailleurs?

+2 -0

lmghs a donné la raison. Je rajouterais que c’est pour éviter de tels comportements qu’il faut utiliser des options de compilation. Avec -Wmissing-declarations tu obtiens un avertissement lorsque tu utilises une fonction qui n’a pas encore été déclarée et avec -Werror on transforme tous les avertissements en erreurs ce qui fait qu’avec ces deux options tu obtiens une erreur à la compilation avec ton code en C.

Je fais un carnage si ce car nage car je nage, moi, Karnaj ! - Tutoriels LaTeX - Contribuez à un tutoriel Ruby

+2 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte