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

C++ Discussion :

Mélange de C et de C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut Mélange de C et de C++
    Bonjour à tous,

    Je suis actuellement en train de faire le portage d'un code C++ écrit pour le système d'exploitation SCO avec un compilateur pas très standard (compilateur SCO version 5) vers un C++ le plus standard possible (STL et tout et tout) actuellemenet j'utilise gcc 4.0.1 avec la librairie libstdc++.

    Malgré quelques petit litige j'ai réussi à compilé mon mon premier exécutable, c'est au linkage que ça ne passe pas.

    Alors je ne suis pas expert en C++ (connaissance scolaire) par contre j'ai déjà fait quelques projet conséquent en C et en Java.

    Mon problème est donc le suivant, le code C est mélangé au C++, par exemple dans un fichier .cpp on peut trouver des chose comme (ce code est placé directement dans le module tempo.cpp et ne fait parti d'aucune fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     static char buffer[256];
     static char nom_ftempo[100];
     Fichier_circulaire trace_tempos;
     Horloge horloge;
     
     Tempo::Tempo ( int d, u_char t, int c, int r, int s, precision p ) {
      //Contenu du constructeur
      }
    //Suite de la description du constructeur
    En gros, dans ce code, on fait appel à des variables globales et interne au module à manière d'une programmation en C, et cela très régulièrement. Je n'ai pas le temps (ni l'envie) de réécrire toute mon application, quelle solution me proposez vous pour que je puisse linker avec gcc (option de compilation) en respectant le standard au maximun.

    J'ai essayé essayé l'utilisation des balises extern "C" { } mais je ne suis pas sur que ce soit la bonne solution.

    Merci d'avance pour vos réponse

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    J'ai du mal à voir le problème dans le code donné en exemple (en terme de compilation bien sûr). Si le dans un module de compilation on utilise des variables internes ça ne pose pas de soucis en C++.
    C'est vrai qu'en général, on préfèrera les déclarer dans le namespace anonyme plutôt que d'utiliser le mot-clef 'static. Cependant, ce n'est pas une obligation.
    Si on utilise des variables globales définies dans une autre unité de compilation, alors il faut les redéclarer en 'extern' comme en C.
    Les problèmes d'édtion de liens entre C et C++ proviennent souvent plutôt des symboles générés pour représenter les fonctions.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Donc d'après toi on peut déclarer des variables globales en C++ de la même manière qu'en C ?

    Peux tu expliquer un peu plus ce que tu entend par :
    Les problèmes d'édtion de liens entre C et C++ proviennent souvent plutôt des symboles générés pour représenter les fonctions.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Citation Envoyé par jeje99
    Donc d'après toi on peut déclarer des variables globales en C++ de la même manière qu'en C ?
    Tout à fait. Un simple test, te convaincras sûrement plus vite.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Je viens de faire un test et effectivement ça marche, mon problème doit donc plutôt venir de l'utilisation de librairie C.

    Merci bien pour la réponse utltra rapide

  6. #6
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    vi, comment ca se passe quand tu appelle une librairie exisant en c et c++? avec un compilo c++? c'est les memes?

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Bin si j'ai bien compris, pour que le linkage, se passe bien quand on utilise des modules ou des librairies compilées en C avec gcc. Il faut encadrer les inclusion de fichiers d'entête de ces librairies par le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    extern "C" {
     #include <enteteLibrairieCompileeEnC.h>
    }
    Donc moi, je n'ai plus qu'à partir la chasse au entête C de librairie compilée en C... Domage qu'on ne distingue pas les deux type d'entête et que le fichier s'appelle toujours .h (comme par exemple .c et .cpp).

    J'ai bon ?

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Désolé pour la réponse partielle.
    Effectivemment, pour une même fonction le compilateur C ne générera pas le même symbole que le compilateur C++ dans le fichier objet résultant de la compilation de l'unité.
    Donc, si dans une unité de compilation C++ on utilise une fonction définie dans une unité compilée en C, il faut préciser que ces fonctions sont du C via une directive "extern C".
    Faute de quoi, il y aura une erreur à l'édition de lien.

    Plus d'info sur la FAQ de ce site (sûrement ?) et sur cette traduction française de la FAQ light http://www.ensta.fr/~diam/c++/online...nd-cpp-fr.html

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Par défaut
    Pour complément, le programme que je dois porter utilise des librairies posix standards par exemple :
    signal.h ou errno.h

    Y a t'il des équivalents c++ ou je dois utiliser extern "C" ?

    Plus généralement, comment on fait pour utiliser des librairies posix dans du C++ ?

  10. #10
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Mon compilo doit être une exception alors, je n'ai jamais eu de soucis en compilant un programme C++ incluant des lib C standards.

    En fait, même avec g++, je n'ai pas eu de souci, sans rajouter de extern pour l'instant (il s'agissait de ncurses).

    Par contre si tu dois utiliser des libairies pré-compilées en c, là oui, les soucis commencent.

    Va faire un tour sur le site de Bjarne Strourtup, il est très complet sur le sujet.

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

Discussions similaires

  1. [PHP-JS] mélange php et javascript
    Par nicoaix dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2005, 17h54
  2. [Débutant] Eclipse mélange mes servlets
    Par kennie77 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/11/2005, 11h15
  3. réseau et mélange windows XP pro et window XP familiale
    Par maniaco_jazz dans le forum Développement
    Réponses: 5
    Dernier message: 15/08/2005, 11h01
  4. Mélange du résultat d'un select
    Par elmaxbo dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/05/2005, 13h01
  5. événements mélangés
    Par ceugniet dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2005, 11h58

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