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 :

[Précompilation] Prototypage d'arguments?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut [Précompilation] Prototypage d'arguments?
    Bonjour,

    J'étudie l'algorithme de hashage MD2. On en trouve la définition officielle sur le site de

    l'IETF dans le RFC 1319: http://www.ietf.org/rfc/rfc1319.txt

    Il y a, sur cette page, un exemple d'implémentation en C.

    Je vais énoncer ma question de façon claire et naïve: c'est quoi ce bidule "PROTO_LIST"???

    Je met ci-dessous quelques extraits de code. Sinon, vous pouvez aller voir sur la page du RFC et faire simplement une recherche sur "PROTO_LIST"

    Voici un extrait du fichier MD2.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MD2Init PROTO_LIST ((MD2_CTX *));
    void MD2Update PROTO_LIST
      ((MD2_CTX *, unsigned char *, unsigned int));
    void MD2Final PROTO_LIST ((unsigned char [16], MD2_CTX *));

    Un extrait de MDDRIVER.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static void MDString PROTO_LIST ((char *));
    static void MDTimeTrial PROTO_LIST ((void));
    static void MDTestSuite PROTO_LIST ((void));
    static void MDFile PROTO_LIST ((char *));
    static void MDFilter PROTO_LIST ((void));
    static void MDPrint PROTO_LIST ((unsigned char [16]));
    Et pour info, voici le fichier GLOBAL.h :
    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
     
    /* GLOBAL.H - RSAREF types and constants
     */
     
    /* PROTOTYPES should be set to one if and only if the compiler supports
         function argument prototyping.
       The following makes PROTOTYPES default to 0 if it has not already
         been defined with C compiler flags.
     */
     
    #ifndef PROTOTYPES
    #define PROTOTYPES 0
    #endif
     
    /* POINTER defines a generic pointer type */
    typedef unsigned char *POINTER;
     
    /* UINT2 defines a two byte word */
    typedef unsigned short int UINT2;
     
    /* UINT4 defines a four byte word */
    typedef unsigned long int UINT4;
     
    /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
       If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
         returns an empty list.
     */
    #if PROTOTYPES
    #define PROTO_LIST(list) list
    #else
    #define PROTO_LIST(list) ()
    #endif
    Un tout grand merci d'avance à qui peut m'aider!!!

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    En fait c'est que le code a été écrit pour pouvoir fonctionner avec des compilateurs pré-C90.

    Avant C90, une fonction se déclarait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int fonction ( param1, param2 )
    char param1 ;
    int param2 ;
    {
    ...
    return i ;
    }
    A partir de C90, on DOIT donner le type des arguments lors de la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int fonction ( char param1, int param2 )
    {
    ...
    return i ;
    }
    Donc le PROTO_LIST est une macro permettant de lister les arguments dans la déclaration en forçant du code pré-C90 à se comporter vis à vis de l'extérieur comme du code C90 et après, c'est à dire d'avoir des interfaces de fonctions conformes.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par souviron34
    A partir de C90, on DOIT donner le type des arguments lors de la déclaration :
    On peut -- et c'est preferable -- mais ce n'est pas obligatoire. Ce n'est toujours pas obligatoire en C99. (C'est obligatoire en C++).

    Donc le PROTO_LIST est une macro permettant de lister les arguments dans la déclaration en forçant du code pré-C90 à se comporter vis à vis de l'extérieur comme du code C90 et après, c'est à dire d'avoir des interfaces de fonctions conformes.
    A noter que ca ne fonctionne que pour les declarations, pas les definitions. La technique est donc d'utiliser PROTO_LIST dans la declaration et la forme K&R dans la definition; pour que ca fonctionne sans probleme dans tous les cas, il faut avoir vu la declaration qui sera utilisee pour les appels.

  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
    Apparemment, la distinction n'est pas "C90 ou K&R" mais "Avec prototypes ou sans prototypes".

    Toutefois, la raison de s'embêter à taper les prototypes pour ensuite autoriser le compilo à ne pas les utiliser m'échappe complètement...

    Il n'existe quand même pas de compilos qui interdisent tout prototype, si ?
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Médinoc
    Il n'existe quand même pas de compilos qui interdisent tout prototype, si ?
    Les compilateurs pre-standardisation ne les interdisent pas, mais ils ne savent pas ce que c'est, ce qui revient au meme !

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Il n'existe quand même pas de compilos qui interdisent tout prototype, si ?
    Les prototypes font parties des choses que le C a importe du C++. Des compilateurs suffisemment anciens ne les connaissent simplement pas. Pouvoir compiler sur ces compilateurs etait un probleme de tous les jours au debut des annees 90 (et gcc ne s'est libere que recemment -- deux ou trois ans -- de la contrainte de compiler sur des compilateurs K&R; certains Unix etaient -- sont toujours? -- fournis avec un compilateur K&R, le compilateur ANSI etant un supplement).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Ok, merci beaucoup pour vos réponses!

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

Discussions similaires

  1. Arguments pour et contre Access ?
    Par bottura dans le forum Sondages et Débats
    Réponses: 240
    Dernier message: 23/03/2018, 23h25
  2. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  3. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  4. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

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