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 :

C++ et le 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
    Avril 2003
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 116
    Par défaut C++ et le C
    Bonjour,
    je voudrais savoir comme spécifier dans du code C++ au compilateur que la fonction est écrite en C.

    merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut
    Salut,

    une petite recherche dans la FAQ donne la réponse ici

    penser à utiliser la

    Tarrke

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    euh...
    D'après ce que j'ai pu voir, ça ne spécifie pas que la fonction est écrite en C, mais qu'elle est a une interface (le nom interne, entre autres) de fonction C.
    Mais il me semble bien que l'intérieur peut être en C++...

    PS: Je viens de tester sous Visual 6:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class CClasseTest
    {
    public:
    	void printSelf();
    };
     
    void CClasseTest::printSelf()
    {
    if(this==NULL)
    	puts("Je suis NULL");
    else
    	printf("J'ai l'adresse %08X\n", this);
    }
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    void testExternC()
    {
    CClasseTest cctTest1;
    CClasseTest *pt_cctTest2 = NULL;
     
    pt_cctTest2->printSelf();
    cctTest1.printSelf();
    pt_cctTest2 = new CClasseTest;
    pt_cctTest2->printSelf();
    delete pt_cctTest2;
    }
     
    #ifdef __cplusplus
    }
    #endif
    La fonction est bien en c++, mais elle son nom interne sera en C
    ( _testExternC au lieu de ?testExternC@@YAXXZ )
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut
    Citation Envoyé par La FAQ
    il est tout à fait possible d'utiliser des bibliothèques écrites en C dans un programme C++ pour autant qu'elles soient déclarées correctement dans les fichiers d'en-tête en utilisant le extern "C" qui indique que la fonction doit être considérée comme du code C et non C++.
    moi je comprends ça comme la réponse à la question ci-dessus. On peut utiliser des librairies écrites (et compilées) en C à partir du moment où l'on déclare ces fonctions comme étant en C.

    Ceci di le code suivant compile en C++ mais n'est pas du C++, c'est du C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
       printf("Hello World\n");
       return 0;
    }
    Un compilo C++ (tel que g++) le prendra sans aucun problème. Il est donc possible de mettre du code C dans un code C++ pour le compiler, mais si l'on souhaite employé un code compilé en C dans un code C++ il faut le déclarer au compilateur. Ce qui rejoint ce que disait Médinoc sur les noms internes, le compilo doit avoir le bon nom pour rechercher la fonction dans la lib...

    Tarrke

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    extern "C" permet d'utiliser des fonctions écritent en C mais celle ci doivent être compilées dans un fichier objet à part grâce à un compilateur C, il faut donc faire :

    fichier cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class CClasseTest
    {
    public:
    	void printSelf();
    };
     
    void CClasseTest::printSelf()
    {
    if(this==NULL)
    	puts("Je suis NULL");
    else
    	printf("J'ai l'adresse %08X\n", this);
    }
    Fichier d'en tête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    void testExternC(void)
     
    #ifdef __cplusplus
    }
    #endif

    Fichier c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void testExternC()
    {
    CClasseTest cctTest1;
    CClasseTest *pt_cctTest2 = NULL;
     
    pt_cctTest2->printSelf();
    cctTest1.printSelf();
    pt_cctTest2 = new CClasseTest;
    pt_cctTest2->printSelf();
    delete pt_cctTest2;
    }
    Il faut bien sûr que le code du fichier .c soit du C

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh...
    J'ai peur que tu aies pris le problème à l'envers: Les deux fonctions sont en C++.

    Mais TestExternC peut être appelée depuis un code source en C, bien qu'elle soit en C++ (car son interface est en C)
    TestExternC peut également être appelée depuis un code source C++, car l'entête signale au compilateur C++ que TestExternC possède une interface en C.
    Exemple:

    Fichier d'en tête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    void testExternC1(void);
    void testExternC2(void);
     
    #ifdef __cplusplus
    }
    #endif
    Inclut dans un fichier C, le extern "C" est ignoré: Tout ce que voit le compilateur, ce sont deux déclarations de fonction C (impossible de déclarer une fonction C++).
    Inclut dans un fichier C++, le extern "C" signale au compilateur que les fonctions (C ou C++) sont déclarées en C ( le nom de la première sera _testExternC1 au lieu de ?testExternC1@@YAXXZ et la seconde, pareil).

    Fichiers C et/ou C++ :
    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
    #ifdef __cplusplus
    extern "C" {
    #endif
    void testExternC1()
    {
    CClasseTest cctTest1;
    CClasseTest *pt_cctTest2 = NULL;
     
    pt_cctTest2->printSelf();
    cctTest1.printSelf();
    pt_cctTest2 = new CClasseTest;
    pt_cctTest2->printSelf();
    delete pt_cctTest2;
    }
    #ifdef __cplusplus
    }
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifdef __cplusplus
    extern "C" {
    #endif
    void testExternC2()
    {
    puts("bonjour");
    }
    #ifdef __cplusplus
    }
    #endif
    Pour un compilateur C, extern "C" sera ignoré: testExternC1 ne sera pas compilable (syntax error et cie) et testExternC2 sera tout simplement une fonction C compilé en C par le compilateur C.
    Pour un compilateur C++, extern "C" sera pris en compte, et le compilateur C++ compilera sans problème les deux fonctions mais leur donnera une interface C( Il appellera la première _testExternC1 au lieu de ?testExternC1@@YAXXZ et la seconde, pareil)

    Dans les deux cas, testExternC2 pourra être appelée aussi bien depuis un fichier C que depuis un fichier C++. testExternC1 également, à supposer qu'elle ait été compilée.
    Le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "fichier.h"
     
    int main(int argc, char *argv[], char *envp[])
    {
    testExternC1();
    testExternC2();
    }
    passera sans problème aussi bien dans un compilateur C qu'un compilateur C++
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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