Bonjour,
je fais actuellement un portage d'un application codée et développée avec Visual Studio 6. Le projet en lui-même est assez conséquent, mais il fonctionne et compile bien. Le portage se fait de windows vers Linux. Il faut donc changer d'outils (Makefile/autotools), et de compilateur (gcc).
J'en suis actuellement à la seconde phase (après avoir convertit les .dep, .mak & co en des fichiers utilisables par les GNU autotools [automake, autconf, ..]) qui consiste au passage du compilateur de Visual Studio 6 à Gcc. Dans un premier temps, comme certaines parties du code dépendent de librairies windows (comme winsock), j'utilise mingw (le port de GCC sous windows). J'ai déjà corrigé pas mal d'erreurs (les __int64 de VS par exemple, etc..), mais je suis tombé sur un os, et j'ai peur de ne pas comprendre le comportement du compilateur de Visual Studio (et/ou inversement).
Je me trouve dans un cas de références croisées. Je ne sais pas si c'est réellement le terme, alors je vais tenter une petite explication :
Du coup, il faut que chacune inclue les 2 autres. J'ai bien le header define pour éviter que le compilateur ne tourne en rond dans la lecteur des .h. J'ai également bien déclaré des placeholder (c'est surement pas comme ça que ça s'appel non plus) comme par exemple pour ma librairie hdr1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 hdr1.h class X1 a besoin de Y2 et Y3 (des champs Y3.bibi et Y2.bobo par exemple) class X2 hdr2.h class Y1 a besoin de X1 et Z2 class Y2 a besoin de X2 class Y3 a besoin de Z1 hdr3.h class Z1 a besoin de Y2 et X2 class Z2
Dans un cas simple cela marche, en compilant avec gcc (enfin g++) et le compilateur de Visual Studio.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #ifndef _HDR1_H #define _HDR1_H #include "hdr2.h"; #include "hdr3.h" class Y1; class Y2; class Y3; class Z1; class Z2; class X1 { [....] // le reste de mon code } [...] #endif
Maintenant, dans le code que j'ai à porter (qui n'est donc pas de moi au départ), il y a des éléments de code dans le header. Par exemple, il y a le code d'une des méthodes (un return Y2.LeChamp. Je n'ai pas pour habitude de mettre du code dans un header, mais j'ai cru comprendre que les codes inline (notion qu'il faut que j'approfondisse) était "obligatoire" dans le header. Mais pour revenir à mon problème, je fais donc appel à des champs 'une des classes, mais qui n'existe pas encore au moment ou le compilateur passe sur ce code [j'entends par là, qu'on lui a dit que Y2 était une classe, mais il n'a pas encore lu hdr2.h, par exemple]. Une solution serait bien entendu de virer tout code du header et le reporter dans les .cpp correspondant. C'est la "solution" que j'envisage.
Cependant, je me pose une question. Ce code compile avec Visual Studio, et je continue de me manger de belles erreurs avec g++. Le compilateur de Visual Studio ne fonctionne pas de la même manière que g++, je m'en suis aperçu, mais je me demande jusqu'où ? Le compilateur de Visual Studio serait-il trop permissif (laissant passé des champs qui n'ont pas encore été définis) ou alors ferait-il plusieurs passes ?
Si quelqu'un est capable de m'éclairer sur ce point, j'en serais ravi.
Hum, ça avait plus sa place dans le forum "Outils pour C & C++ / EDI / Compilateurs / etc "
Partager