IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Générateurs de compilateur Discussion :

Compilation C et C++ (Mix')


Sujet :

Générateurs de compilateur

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut Compilation C et C++ (Mix')
    Bonjour,

    Je voudrais savoir comment mixer du code C et C++
    Je vous détaille un exemple simple.

    J'ai un fichier C++ (.h et .cpp) qui déclare une classe Personne.
    Une personne est définie par son nom (string) et son age (int).
    Les fonctions de cette classes sont :

    - Le constructeur qui prend en paramètre un char* et un int
    - Une fonction d'affichage qui affiche les données caractéristiques de la personne
    - Les getters/setters sur chaque attributs ( à savoir que pour l'attribut name, le type rendu par le getter et celui reçu par le setter est du char * )

    Je voudrais utiliser cette classe Personne dans un fichier main.c

    Comment faire pour rendre compatible et utiliser ma classe Personne dans le fichier main.c, et comment compiler le tout ?

    Ceci est juste un exemple que j'implémente afin d'y voir plus clair, je me consacrerai dès son bon fonctionnement à quelque chose de plus conséquent, si vous pouviez donc m'aider, j'en serais vraiment ravi =)

    Bonne journée à vous tous !

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 377
    Points
    20 377
    Par défaut
    Salut,

    Citation Envoyé par MacInTouch Voir le message
    Je voudrais utiliser cette classe Personne dans un fichier main.c
    ce n'est pas possible à ma connaissance sauf preuve du contraire.
    Si tu as un fichier .c, le préprocesseur ne reconnaitra pas les mots-clés comme class,new.
    Citation Envoyé par MacInTouch Voir le message
    Comment faire pour rendre compatible et utiliser ma classe Personne dans le fichier main.c, et comment compiler le tout ?
    c'est bête comme chou : il suffit de faire une bibliothèque statique .lib avec des fonctions _cdecl qui gèrent la classe Personne ,par exemple void GerePersonne() puis tu les déclares dans un fichier .h en extern

    C'est peut-être possible de compiler un fichier .cpp en fichier objet de compilation .obj puis de l'inclure au projet.
    Mais le plus simple c'est de faire un fichier .lib

  3. #3
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonjour,
    Les compilateurs C++ sont capables de compiler du code C.
    « Qui peut le plus, peut le moins. »

    Alors si tu as des sources C et des sources C++, le plus simple est probablement de compiler le tout avec un compilateur C++.
    Quitte à mettre toutes les fonctions C dans des blocs extern "C" { ... }, pour bien indiquer au compilateur qu'il doit considérer la fonction comme étant du C (c'est un peu plus compliqué en réalité).

    Et si le code C peut être utilisé ailleurs par un compilateur C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    (...)
     
    #ifdef __cplusplus
    }
    #endif
    Pour info, tu utilises quel compilateur ?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Re Bonjour,

    Merci à tous pour vos réponses qui m'ont été très utiles !
    J'ai marqué le sujet comme résolu, mais je me permets d'y exposer ma solution defois que d'autres rencontreraient un jour le même problème.

    Il faut savoir que ceci concernait un exercice avec Lex & Yacc, je cherchais en fait à manipuler mes classes C++ dans le fichier Yacc ( ce qui n'est normalement pas possible )

    Je possède donc une classe :
    1. MaClasse.h
    2. MaClasse.cpp


    Un fichier File.y

    Un fichier File.l

    Un fichier Main.cpp

    Pour utiliser ma classe C++, j'ai donc créé deux autres fichiers :
    1. Manip.h
    2. Manip.cpp


    Dans Manip.h, il ne doit y avoir aucune référence à du code C++, pas d'include rien et il faut y apporter quelques supplément :
    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
    17
     
    #ifndef _MANIPH_
    #define _MANIPH_
     
    #ifdef __cplusplus
    	extern "C"
    	{
    #endif
     
    		/* Liste des Fonctions qui manipuleront la classe C++ */
     
     
    #ifdef __cplusplus
    	}
    #endif
     
    #endif // _MANIPH_
    Dans le fichier C++ correspondant à ce header, on peut mettre autant de référence à du code C++ que l'on veut, et on écrit le corps de nos fonctions :

    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
     
    #include <iostream>
    #include "Manip.h"
     
    using namespace std ;
     
     
    extern "C" void maFonction1 ()
    {
    cout << " Dans le fichier C++ :D " << endl << endl ;
    MaClasse * foo = new MaClasse () ;
    /*Autant de manip' que l'on veut sur notre variable foo */
    }
     
    /* Etc .... */
    On inclut ensuite dans le fichier File.y le fichier Manip.h
    On peut du coup utiliser dans File.y toutes les fonctions de Manip.h

    Le fichier Main.cpp :

    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
    17
    18
    19
    20
    21
    22
     
     
    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
     
    #include "y.tab.h" // Fichier générer par Yacc
     
    extern FILE *yyin ;
     
    extern "C" 
    {
    	int yyparse(void);
    }
     
    int main(void) 
    {	
        yyin = fopen ("Projet.txt", "r") ;
        yyparse () ;   
        fclose (yyin) ;
        return 0;
    }
    Puis finalement pour la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    yacc -d Projet.y
    lex Projet.l
     
    gcc -c -o lex.yy.c.o lex.yy.c // Le fichier généré par lex
    gcc -c -o y.tab.c.o y.tab.c // Le fichier généré par yacc
     
    g++ -c -o Main.cpp.o Main.cpp
    g++ -c -o Manip.cpp.o Manip.cpp
     
    g++ -c -o MaClasse.cpp.o MaClasse.cpp
     
    g++ -o launcher *.o -ll
    Voila, j'éspère avoir été suffisamment clair, bonne continuation à tous

    MacInTouch

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par MacInTouch Voir le message
    Il faut savoir que ceci concernait un exercice avec Lex & Yacc, je cherchais en fait à manipuler mes classes C++ dans le fichier Yacc ( ce qui n'est normalement pas possible )
    Si tu utilises un compilateur C, en effet ce n'est pas possible.
    Mais si tu prends un compilateur C++, plus de problème.

    lex et yacc se fichent complètement du code que tu écris dans les fichiers *.l et *.y.
    Pour eux, c'est juste des blocs à écrire tels quels à des endroits prédéterminés dans les fichiers qu'ils génèrent.
    D'ailleurs, si tu fais une erreur de syntaxe, normalement c'est le compilateur qui te le dis, pas lex ni yacc.
    Donc tout ce que tu dois faire, c'est utiliser un compilateur capable de comprendre à la fois le code généré par lex/yacc et le code que tu as écris dans les fichiers (enfin il faut tout de même une certaine harmonie...).

    Encore une fois, tu peux compiler du C avec un compilateur C++.
    De plus, ton projet semble être en C++.
    Donc pas de question à se poser, compile tout avec ton compilateur C++...

    Sinon, tu utilises vraiment lex et yacc ?
    Ce ne sont pas des wrapper pour flex et bison, par exemple ?
    S'il s'agit bien de lex et yacc, ça m'intéresse.
    J'écris des parseurs avec flex/bison, et j'aimerais savoir à quel point je peux utiliser leurs fonctionnalités tout en restant compatibles avec lex/yacc.
    Mais je n'arrive pas à trouver de documentation sur Internet.
    Ni les logiciels
    Peut-être cherché trop rapidement...

    Pour finir, flex et bison sont capable de générer un scanner et un parseur C++.
    Je ne sais pas si c'est le cas pour lex et yacc.
    Il existe aussi flexc++ et bisonc++.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mix de dll compilées sous intel compiler et visual c++ compiler
    Par ppaul127 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 13/11/2007, 08h50
  2. [Installation] Borland Compiler 5.5 sous XP
    Par Ligey dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 28/09/2002, 22h45
  3. dans le fond, la compilation...
    Par deltapositive dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/09/2002, 12h14
  4. Vitesse de compilation
    Par srvremi dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/07/2002, 16h49
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo