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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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
    • #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 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
    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

+ 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