Fonctionnement des include et headers [Résolu] - C++ - Programmation
Marsh Posté le 01-07-2011 à 09:41:53
Explique moi comment tu peux utiliser les macros : COORD_OFFSET_WORLD_X , COORD_OFFSET_WORLD_Y et WORLD_CUBE_PX dans convert.cpp sans y inclure le fichier où ces macros sont définies ?
Marsh Posté le 01-07-2011 à 10:58:51
dans convert.cpp, ajoute un include de include.h pour faire au plus simple.
Le problème vient du fait que tes headers, dans le cas général, devraient pouvoir être inclus de manière autonome. J'explique : tu devrais pouvoir inclure convert.h sans te poser de questions si tu as besoin de conversion.
Si jamais tu veux partager des constantes, alors c'est ton fichier qui a besoin des constantes (ici, seulement tes .cpp) qui inclus le fichier de constantes (include.h) et pas le fichier de constante qui inclus du code dont il n'est pas responsable.
Marsh Posté le 01-07-2011 à 11:18:42
Crom29.
La seule bonne technique qui marche est la suivante:
Pour le module toto.h (ou toto.hpp)
#ifndef TOTO_H
#define TOTO_H
....
#endif
Et avec ça, tu auras jamais de pb de double inclusion de toto.h.
Et dans tes fichiers .c (ou .cpp), la ou tu as besoin de ce qui est défini dans toto.h (et uniquement dans ces fichiers la), tu fais un
#include "toto.h"
To #include "include.h" avec un include qui contient les autres, c'est une mauvaise technique, à rejeter. Le #include "convert.h" n'a rien à faire dedans.
A+,
Marsh Posté le 01-07-2011 à 19:04:52
Merci beaucoup de vos réponses !
donc si j'ai bien compris, je devrais faire comme ça :
convert.h : Pas d'include ni de define
Code :
|
convert.cpp : juste include du .h contenant les déclarations des fonctions
Code :
|
main.cpp : Tous les include et tous les define
Code :
|
merci de me confirmer
Edit : Ca ne fonctionne pas
Il ne reconnais plus les fonctions, types et struct normalement incluses avec la SDL dans mes fichiers (autres que main.cpp)
Marsh Posté le 01-07-2011 à 19:18:50
C'est mieux.
convert.cpp il va avoir besoin d'un #include avec le fichier qui contient la définition de SDL_Rect puisqu'il l'utilise.
A+,
Marsh Posté le 01-07-2011 à 19:56:57
hum... j'ai édité un peu tard !
pas grave, j'ai ma réponse ^^
donc je récapitule :
main.cpp : tous les include, define, struct... etc
convert.h : Juste les déclarations des fonctions définies dans convert.cpp
convert.cpp : Les include qu'utilisent les fonctions définies + include convert.h
A ce moment là, peut on remettre tous les include déja dans le main.cpp dans convert.cpp, sans risques de doubles include?
merci
edit : Ca ne compile toujours pas : il ne reconnais pas les macro définies dans le main.cpp et utilisées dans le convert.cpp. De même pour les variables globales
Marsh Posté le 01-07-2011 à 20:00:19
tu t'es complètement vautré ...
Il faut tout de même que tu comprennes comment se passe la compilation ... Au moins grossièrement.
Ton compilateur ne tient compte que des fichiers c ou cpp. Chacun de ces fichiers va être considéré comme une unité de compilation et va générer un fichier objet intermédiaire.
Une fois tous les objets générés, on passe éventuellement à l'édition de liens pour la production du fichier final (exécutable par exemple)
Quand tu tapes #include "unFichier.h" , en clair, tu demandes à ton préprocesseur de recopier ce fichier à cet endroit précisément dans ton unité de compilation.
Si tu as besoin qu'une constante soit accessible au sein d'une unité de compilation, alors il faut que tu demandes à ton préprocesseur d'aller te chercher l'entête qui la contient.
Si tu commences à mettre tes constantes (par exemple WORLD_CUBE_PX) directement dans une unité de compilation (dans ton dernier cas : main.cpp) alors elles ne seront jamais disponibles pour une autre unité de compilation où tu en aurais éventuellement besoin (ici : convert.cpp)
Il en va de même pour tes déclarations de fonctions ...
Marsh Posté le 01-07-2011 à 20:14:02
j'essaye de comprendre mais ça rentre assez mal ^^
si j'ai bien compris (cette fois ^^) :
Main.cpp :
Code :
|
vars_et_cstes.h :
Code :
|
convert.h : pas de modifs
convert.cpp : Recopier tous les include du main?
EDIT : c'est fait, et j'ai des problèmes de définitions multiples de variables comme nWorld, oWindow... il me semblait que les ifndef+include+endif empêchaient ça...
Une question me trotte dans la tête : si j'avais mis les define et vars globales au dessus des include, ça aurait marché aussi?
Marsh Posté le 01-07-2011 à 21:43:19
Surtout pas:
Pas de vars dans un .h sinon, ça va vouloir créer des vars distinctes dans chaque fichier ou il est inclus...
Bon.
On va démarrer par convert.cpp:
Code :
|
Il a besoin de la définition de SDL_Rect => #include <SDL/SDL.h>
Il a besoin de la définition de diverses constantes => on va définir un fichier avec ces constanrtes.
En général, il porte le même nom que celui du programme, je vais l'appeller monprog.h ici.
D'ou
monprog.h
Code :
|
et ça donne pour convert.cpp:
Code :
|
D'ou on déduit convert.h
Code :
|
Reste maintenant le cas du fichier contenant main. En ce qui me concerne, je préfère l’appeler le même nom que celui du programme, je vais l'appeller monprog.c ici.
monprog.c
Code :
|
Et ça devrait rouler.
A+,
Marsh Posté le 01-07-2011 à 22:48:12
Merci pour ta réponse !
ça compile, c'est parfait ! enfin presque ^^
déja, je note ce que j'ai compris qu'il fallait faire :
main.cpp : Include de stdio.h, sdl.h ...
Include de main.h qui contient les constantes
Include des .h que j'utilise dans le main.cpp
Définition des variables globales
main(...){...}
main.h : Liste des constantes & macro utilisées (et bien sûr #ifndef ... #endif)
convert.cpp : Include de stdio.h, sdl.h ...
Include de main.h qui contient les constantes
Ne pas mettre Include "convert.h"
Si je veux réutiliser des variables globales, je les "re-déclare" en extern
convert.h : Déclaration des fonctions de convert.cpp (et bien sûr #ifndef ... #endif)
Il me reste quand même quelques questions :
- Si je veux déclarer une structure, dois-je la mettre dans le main.h ?
- Mettons que j'ai un 3e couple de fichiers (world.cpp et world.h) et que dans world.cpp je veuilles utiliser dedans une fonction de convert.cpp, que dois-je faire?
Pour l'instant j'ai rajouté #include "convert.h" en haut de world.cpp, mais il ne veut pas reconnaitre la fonction...
merci beaucoup !
Marsh Posté le 01-07-2011 à 23:21:42
Citation : - Si je veux déclarer une structure, dois-je la mettre dans le main.h ? |
Si elle est utilisée ailleurs que dans main.c, oui.
Citation : - Mettons que j'ai un 3e couple de fichiers (world.cpp et world.h) et que dans world.cpp je veuilles utiliser dedans une fonction de convert.cpp, que dois-je faire? |
C'est que tu as du faire une faute de frappe dans le nom de ta fonction, car c'est comme ça qu'il faut faire.
A+,
Marsh Posté le 02-07-2011 à 00:19:24
Citation : C'est que tu as du faire une faute de frappe dans le nom de ta fonction |
J'aimerais bien, parce que c'est comme ça que j'ai compris !
mais vu que si je colle la fonction dont j'ai besoin au début de world.ccp ça marche... je recommence à douter ^^
voici le code :
convert.cpp :
Code :
|
convert.h :
Code :
|
guifunc.cpp : Erreur : undefined reference to ' CoordWorldToScreen(SDL_Rect)'
Code :
|
guifunc.h :
Code :
|
Merci encore
note : je ne pourrais pas répondre ce week end, alors prenez votre temps ^^
Marsh Posté le 02-07-2011 à 03:16:24
Tes fichiers seraient pas dans des répertoires différents?
Parce que la, ce code la est bon, la seule chose que je vois qui ferais l'erreur indiquée, c'est que le compilo trouve pas convert.h quand il compile guifunc.cpp
A+,
Marsh Posté le 03-07-2011 à 20:38:24
bon.... le fichier était bien dans le dossier du programme mais ça ne compilait toujours pas, et du coup j'ai carrément refait un projet et là ça a marché direct ^^
Merci beaucoup de m'avoir aidé, je vais marquer le sujet comme résolu et mettre un petit résumé dans le 1er post
Marsh Posté le 01-07-2011 à 00:09:52
Salut !
Ça fait déjà un petit moment que je cherche sur le net pour trouver une technique qui fonctionne (et qui ne soit pas trop prise de tête) pour inclure des headers dans mon programme, sans problèmes de double inclusions, implicit declaration...
Alors, voila : pouvez vous me donner un exemple qui fonctionne bien et/ou me corriger? ^^
Voila comment j'ai procédé :
main.cpp : un #include "include.h" en haut sinon que le main
include.h : Tous les include et define, ainsi que les variables globales utilisées
convert.h : juste les déclarations des fonctions
convert.cpp : Aucun include ni define, juste les fonctions
L'erreur, pour l'instant est qu'il ne reconnait pas CoordScreenToWorld(...)
Merci d'avance !
EDIT : Résumé de ce qu'il faut faire
main.cpp : Include de stdio.h, sdl.h ...
Include de main.h qui contient les constantes, structures...
Include des .h que j'utilise dans le main.cpp
Définition des variables globales
main(...){...}
main.h : Liste des constantes, macro, struct... utilisées, encadrées par #ifndef ... #endif pour éviter les doubles inclusions
convert.cpp : Include de stdio.h, sdl.h ...
Include de main.h qui contient les constantes
Include des autres .h utilisés
Ne pas mettre #include "convert.h"
Pour réutiliser des variables globales, les "re-déclarer" en extern
convert.h : Déclaration des fonctions de convert.cpp (et bien sûr #ifndef ... #endif)
Message édité par crom29 le 03-07-2011 à 20:45:05
---------------
Mods: HAF922 | Shinobi XL White GitHub Admin de La Colère d'Aurile, serveur RP-Action Neverwinter Nights 2