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 :

Une déclaration qui m'intrigue !


Sujet :

C

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut Une déclaration qui m'intrigue !
    Bonjour,

    voilà, depuis peu j'utilise Allegro, j'ai un peu farfouillé dans les headers et là j'ai vu un truc nouveau que j'arrive pas à comprendre. Toutes les fonctions, méthodes, variables sont déclarées d'une façon que je n'ai encore jamais vu en C.
    Exemple, pour une fonction, ils déclarent de cette manière dans les headers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AL_FUNC(int, makecol, (int r, int g, int b));
    Comment celà est-il implémenté pour que la fonction soit reconnu en tant que makecol ? Comment cela fonctionne-t-il ?


    Merci pour vos réponses
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    AL_FUNC est une macro. Je ne sais pas comment elle est exactement declaree, quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define AL_FUNC(r, n, p) r n p
    doit fonctionner.

  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
    En effet.
    Je suppose que AL_FUNC doit contenir divers modifieurs sous certaines plate-formes (ex: convention d'appel, attributs GCC, spécifications de librairies, etc) comme le fait la macro STDMETHOD quand on programme en COM sous Windows...
    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 Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Salut

    Rien ne t'y oblige (j'entends par la que ca ne changera rien pour le compilateur), mais typiquement, NOM_EN_MAJUSCULE = macro.

    Tu peux utiliser cpp sous Linux ou un autre préprocesseur C pour regarder le code généré, et rechercher la déclaration de la macro... Ca doit avoir une certaine forme d'intéret de procéder de la sorte !

    Résolu ?

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ok merci pour les infos, je me doutais bien que c'était une macro mais c'est surtout sur le comment elle est écrite et comment elle fonctionne qui m'interesse. Pour ma part, cela pourrais être interessant, surtout d'un point de vue didactique, j'en ai pas vraiment besoin mais c'est avant tout par curiosité mais je n'est rien trouvé dans les fichiers

    Moi ce qui m'intrigue, je cherche à le comprendre !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Ben en fait, tu as deux syntaxes de macros, avec et sans paramètres... La première forme est très classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TAB_LENGTH 25
    #define MAX_CNT 42
    Le préprocesseur (par exemple cpp) remplace ensuite dans le code source le nom des macros par leurs valeurs (tout ce qui est apres le nom jusqu'en fin de ligne, c'est pourquoi il vaut mieux éviter de terminer une déclaration de macro par un point virgule). C'est très utiles pour changer les bornes de plusieurs tableaux qui doivent avoir la même taille en même temps, mais je pense que je ne t'apprends rien... Il est a noter que la substitution est directe, j'entends par la que si tu ne prends pas certaines précautions ou ne fait pas attention, ca ne fait pas ce que tu veux. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define SIX 1 + 3
    #define NEUF 8 + 1
     
    printf("%d\n",SIX*NEUF); /* Affiche 42 et non 54 ! */


    Plus évolué, les macros peuvent attendre des paramètres, on met la liste entre parenthese apres le nom de la macro, exemple :
    La encore, c'est remplacé de manière bête et systématique par le préprocesseur. La parenthese permettent d'éviter les problemes comme évoqués précédemment. Si on veut écrire la macro sur plusieurs lignes, on finit la ligne précédente par un antislash.

    Wala, c'est plus clair ?

  7. #7
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    #define SIX 1 + 3

  8. #8
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Citation Envoyé par bigquick
    #define SIX 1 + 3
    Mouaiiiii .... Bon, je voulais bien sur dire :

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La encore, c'est remplacé de manière bête et systématique par le préprocesseur. La parenthese permettent d'éviter les problemes comme évoqués précédemment.
    Et encore pas tous, par exemple (classique)
    Donc à manier avec précautions

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ouais merci pour le cours mais si au bout de 2 ans et demi je ne savais pas ca, ce serait grave docteur Nan en fait je pensais que quelqu'un savais comment cela fonctionne concretement ou si quelqu'un avais deja vu ce type d'utilisation, utiliser des macro pour en definitive créer des fonctions, j'estime que c'est quand même balaise ca

    Je rappel tout de même que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AL_FUNC(int, makecol, (int r, int g, int b));
    est bel et bien reconnu comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int makecol (int r, int g, int b);
    M'enfin bon, c'est pas grave, c'etait surtout pas curiosité en fait ni plus ni moins
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Je me disais bien aussi que tu devais le savoir

    Bon, a quoi ca peut servir... Ben une proposition, si je fais un groupe de fonction qui gerent un "truc", par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int machin(void);
    void chose(int a, int b);
    Je peux utiliser utiliser ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define TRUC_FUNC(type, name, arguments) type name arguments
     
    TRUC_FUNC(int,machin,(void));
    TRUC_FUNC(void,chose,(int a, int b));
    Déja, ou voit miue que c'est lié a la gestion de mon "truc" (bon, ok, on peut faire plus propre, mias admettons ...)... Le temps passe et Ho ! Je veux passer le projet en c++ et YOUPI ! Je vais faire une classe "truc" (Oui, je sais, on est sur un forum C, mais ADMETTONS !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class truc {
      int machin(void);
      void chose(int a, int b);
    };
    et dans le code, je peux modifier ma macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define TRUC_FUNC(type, name, arguments) type truc::name arguments
    ...qui génèrera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int truc::machin(void)
    void truc::chose(int a, int b)
    Mwé... pas forcément très convaincant, mais ca peut être un cas ou c'est pratique (genre "truc" est une classe "univers" ou l'on peut tout faire...).

  12. #12
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Autre exemple, on veut intégrer le code C avec un programme en D (Wé, c'est pas commun), plutot que de réécrire tout le fichier h, on modifie la macro en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define TRUC_FUNC(type, name, arguments) extern (C) type name arguments

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin voilà ce que je voulais entendre Là je vois carrement mieux à quoi ca sert .... merci à vous deux !

    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Déclaration d'une fonction qui retourne un date
    Par FABFAB125 dans le forum Débuter
    Réponses: 8
    Dernier message: 06/04/2009, 16h05
  2. Réponses: 2
    Dernier message: 26/08/2003, 14h21
  3. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47
  4. Une déclaration pour la survie du jeu vidéo en France
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 30/10/2002, 14h31
  5. Réponses: 8
    Dernier message: 17/05/2002, 09h08

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