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 :

Sur les #ifdef


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Sur les #ifdef
    J'ai une question sur les #ifdef _cplusplus..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifdef _cplusplus
    namespace std {
    extern "C" {
    #endif
       // 
        int printf(const char*)
       //
    #ifdef _cplusplus
    }
    }
    #endif
    Tel que je le comprends, le code fonctionne comme cela:
    #ifdef _cplusplus est une macro. Elle est "vraie" si le fichier est du C++ ou si l'on code en C++.
    Si cette macro est vrai, le curseur passe ensuite sur namespace std;
    puis sur extren "c"{
    Si c'est faux, il passe directement a int printf()
    Pour moi, ca permet de faire comprendre au compilo qu'il va lire du code en C alors qu'il est en C++. Quand on rentre dans le crochet ifdef _cplusplus, on a extren "C"
    Il s'agit d'une redeclaration, non d'une definition

    On trouve ce genre de code dans les Header ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    • #ifdef _cplusplus n'est pas une macro. _cplusplus (et/ou __cplusplus) est une macro, qui est définie si l'on compile en C++.
    • Le #ifdef est vrai si la macro _cplusplus est définie, donc si l'on compile en C++. Sinon, l'on passe directement au printf.
    • La première ligne dans le #ifdef place la fonction dans le namespace std, comme le veut le standard.
    • La seconde est une instruction pour l'éditeur de liens : Elle indique que la fonction ici déclarée est appelable depuis le C et que son vrai nom est "printf" (ou "_printf", sous Windows) et non pas "?printf@^$ù*^$$^" (enfin, un nom défiguré par le C++, quoi).
      • La fonction n'est pas forcément définie en C. Elle peut être définie dans n'importe quel langage (y compris C++), mais son interface est en C.

    Pour plus d'informations sur extern "C", voir ici:
    http://www.developpez.net/forums/sho...d.php?t=256281
    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.

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    merci je regarde le lien

    mais que je fasse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //#ifdef _cplusplus
    //extern "C"{
    //#endif 
      char* strcpy(char*,const char*);
    //#ifdef _cplusplus
    //}
    //#endif
     
    int main(){
     cout<<strlen("e");
     
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifdef _cplusplus
    extern "C"{
    #endif 
      char* strcpy(char*,const char*);
    #ifdef _cplusplus
    }
    #endif
     
    int main(){
     cout<<strlen("e");
     
    }
    ca produit le mème resultat

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Normal: Tu joues avec la déclaration de strcpy(), mais tu utilises strlen()...

    De plus, ça signifie que strlen() est déjà déclarée, sans quoi tu aurais une erreur de compilation...
    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.

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    oui, pardon:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifdef _cplusplus
    extern "C"{
    #endif 
      char* strlen(char*);
    #ifdef _cplusplus
    }
    #endif
     
    int main(){
     cout<<strlen("e");
     
    }
    Mais j'ai lu ton truc, donc j'ai +- compris

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    j'essaye depuis ce matin de modifier le programme de Medinoc qui est ici:
    http://www.developpez.net/forums/sho...d.php?t=256281
    pour essayer de le faire planter,et pour comprendre a quoi sert "externe"

    Parce que c'est bien joli sur le papier, mais en vrai, ca donne quoi?

    J'ai essaye de supprimer des externe C, des #Ifdef et des #ifndef....
    Malgré tout mes efforts je n'arrive pas a le faire planter

    Est-ce que quelqu'un peux modifier ce programme afin qu'il buge, (au niveau des externes et des linkage bien sur, pas sur le reste du code )

    Merci

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Normalement, le programme lui-même n'est pas supposé "planter" suite à une telle erreur : Le symptôme à attendre sera plutôt un échec de l'édition de liens.
    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.

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Normalement, le programme lui-même n'est pas supposé "planter" suite à une telle erreur : Le symptôme à attendre sera plutôt un échec de l'édition de liens.

    et a quoi ca sert les liens?

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Note: Utilise la balise [QUOTE] [/QUOTE] quand tu cites quelqu'un.

    L'édition de liens est l'étape qui transforme plusieurs fichiers .obj ou .o en un programme exécutable (machin.exe, a.out, etc.).
    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.

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    OK,
    si tu es certais de n'utiliser que VC2005, que tu es certains de coder en C++, et utiliser des fonctions C++ qui ne sont pas "exotiques", comme le C est un sous ensemble du C++, tu n'auras pas besoin d'utiliser des linkage?

    C'est plus une histoire de compilo que de code?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Non-sens.

    Visual Studio 2005 lui-même décompose la génération d'un programme en compilation et édition de liens.

    Et le C n'est PAS un sous-ensemble du C++. Je peux te pondre un programme C parfaitement standard C90 qu'un compilateur C++ refusera.
    Le code C doit être compilé avec un compilateur C, le code C++ avec un compilateur C++. Seule l'édition de liens pourra unir les différents codes C et C++ en un programme exécutable.

    Rappel: Même en ne compilant qu'avec un seul langage, tu as autant de fichiers .o ou .obj que de fichiers source.
    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.

  12. #12
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Et le C n'est PAS un sous-ensemble du C++. Je peux te pondre un programme C parfaitement standard C90 qu'un compilateur C++ refusera.
    D'ou l'utilisation d'un externe C ?

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Non, d'où la séparation du code dans au moins deux fichiers, compilés par deux compilateurs différents.

    extern "C" ne sert qu'à dire "On compile en C++, mais cette fonction a un nom C et non pas un nom 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.

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Voici pour montrer la différence entre un nom C et un nom C++.

    Considérons la fonction déclarée ainsi:
    Sous Visual C++ 8.0, son nom C++ (qui dépend du compilateur) sera : ?uneFonction@@YAHH@Z
    Tandis que son nom C (standardisé sous Windows selon la convention d'appel choisie) sera : _uneFonction

    Et comme une fonction n'a qu'un seul nom, elle ne peut avoir à la fois un nom C et un nom C++.
    Puisque le compilateur C ne peut connaître que le nom C d'une fonction, si l'on veut qu'une fonction soit utilisable par les deux langages :
    • Elle doit avoir un nom C
      • Pour une fonction C, c'est toujours le cas.
      • Pour une fonction C++, on le demande avec extern "C".
    • Et le compilateur C++ doit savoir qu'elle a un nom C.
      • On le lui dit avec extern "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.

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

Discussions similaires

  1. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  2. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  3. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11
  4. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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