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 :

[preprocesseur] ## restant


Sujet :

C

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut [preprocesseur] ## restant
    Bonjour,


    J'ai (encore) un peu problème de macro

    dans mon code c j'ai mis une inclusion comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* ... */
    typedef unsigned char* puchar;
    #define ELEMENT puchar
    #include "fichier.c"
    #undef ELEMENT
     
    /* ... */

    avec fichier.c contenant ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct _CELL_##ELEMENT {
    	ELEMENT elt;
    	struct _CELL_##ELEMENT next;
    } CELL_##ELEMENT;
    typedef CELL_##ELEMENT* LISTE_##ELEMENT;
    le hic, c'est qu'il reste des ## "parasites" après passage du préprocesseur

    le ???.i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef unsigned char* puchar;
     
    # 1 "list.c" 1
     
    typedef struct _CELL_##puchar {
     puchar elt;
     struct _CELL_##puchar next;
    } CELL_##puchar;
    typedef *CELL LISTE_##puchar;
    quelqu'un sait-il comment s'en débarasser ? (si c'est possible bien sûr )

    je pense que le problème vient du typedef qui aurait du me permettre d'avoir des types d'ELEMENT avec des espaces et des étoiles
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  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
    Je crois que ## ne marche que dans une définition de macro.
    Essaie ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define CELL_STRUCT_NAME(elt) _CELL_ ## elt
    #define CELL_TYPEDEF_NAME(elt) _CELL_ ## elt
    #define LISTE_TYPEDEF_NAME(elt) LISTE_ ## elt
     
    /* ... */
    typedef struct CELL_STRUCT_NAME(ELEMENT) {
    	ELEMENT elt;
    	struct CELL_STRUCT_NAME(ELEMENT) next;
    } CELL_TYPEDEF_NAME(ELEMENT);
    typedef *CELL LISTE_TYPEDEF_NAME(ELEMENT);
    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
    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
    Ou encore mieux:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define DECLARE_STRUCT(type) \
    	typedef struct _CELL_ ## type {\
    		type elt;\
    		struct _CELL_ ## type * next;\
    	} CELL_ ## type;\
    	typedef CELL_ ## type * LISTE_ ## type;
    
    /* ... */
    DECLARE_STRUCT(puchar)
    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
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gorgonite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct _CELL_##ELEMENT {
    	ELEMENT elt;
    	struct _CELL_##ELEMENT next;
    } CELL_##ELEMENT;
    typedef *CELL LISTE_##ELEMENT;
    C'est horrible ! ## ne fonctionne évidemment que dans les macros. L'usage du préprocesseur s'apprend, comme le reste. Je conseille de relire d'urgence le chapitre 4.11 du K&R2.

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    effectivement, j'ai oublié que cela ne marchait que dans les macros... j'avais pourtant cela sous les yeux http://www.delorie.com/gnu/docs/gcc/cpp_18.html


    désolé du dérangement


    mon fichier.c est finalement :
    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
    #define DECLARE_LIST(ELEMENT) \
    typedef struct _CELL_##ELEMENT {\
    	ELEMENT elt;\
    	struct _CELL_##ELEMENT* next;\
    } CELL_##ELEMENT;\
    typedef CELL_##ELEMENT* LISTE_##ELEMENT;\
    LISTE_##ELEMENT list_##ELEMENT##_create() {\
    	LISTE_##ELEMENT liste = (LISTE_##ELEMENT) malloc(sizeof(CELL_##ELEMENT));\
    	if (liste == NULL) {\
    		fprintf(stderr,"allocation impossible\n");\
    	}\
    	return liste;\
    }\
    LISTE_##ELEMENT list_##ELEMENT##_insert(LISTE_##ELEMENT liste, ELEMENT e) {\
      if (liste == NULL) {\
            liste = list_##ELEMENT##_create();\
            liste->elt = e;\
        } else {\
            LISTE_##ELEMENT newList = list_##ELEMENT##_create();\
    	newList->elt = e;\
    	newList->next = liste;\
            return newList;\
        }\
        return liste;\
    }
    /* ... */
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    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
    Fais gaffe pour les ## : À ma connaissance, il y a un des compilos disponibles qui ne les accepte qu'espacés (et ce doit être Visual).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Problème entre */
    _CELL_##ELEMENT
    /* et  */
    _CELL_ ## ELEMENT
    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.

  7. #7
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par Médinoc
    Fais gaffe pour les ## : À ma connaissance, il y a un des compilos disponibles qui ne les accepte qu'espacés (et ce doit être Visual).

    mais si je les espace, ça m'insére un espace avec gcc... et ça ne marchera pas
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gorgonite
    mais si je les espace, ça m'insére un espace avec gcc... et ça ne marchera pas
    Jamais vu ça.
    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
     
    #include <stdio.h>
     
    #define DEF(a) int VAR_  ## a
    #define VAL(a) VAR_  ## a
    #define STR(a) "VAR_"  # a
     
    int main (void)
    {
     
       DEF (xxx) = 2;
     
       printf ("%s = %d\n", STR (xxx), VAL (xxx));
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    VAR_xxx = 2
     
    Press ENTER to continue.
    Au fait, je rappelle que les identificateurs commençants par _ sont réservés à l'implémentation. Tu n'as donc pas le droit de les utiliser.

    http://emmanuel-delahaye.developpez....htm#id_reserve
    http://emmanuel-delahaye.developpez....nom_underscore

  9. #9
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Jamais vu ça.
    effectivement, ça marche avec un espace... ça devait foirer quand je n'étais pas dans la macro


    Citation Envoyé par Emmanuel Delahaye
    Au fait, je rappelle que les identificateurs commençants par _ sont réservés à l'implémentation. Tu n'as donc pas le droit de les utiliser.

    effectivement, je ne connaissais pas ces termes réservés... merci
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    au passage, je me demandais s'il était possible de définir une partie avec un #ifdef dans cette déclaration de fonction...

    en gros, je souhaite que les pfprintf ne soient exécutés que s'il y a le flag DEBUG

    Code c : 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
     
    #define DECLARE_AVL(ELEMENT) \
    typedef struct STRUCT_NODE_ ## ELEMENT {\
    	ELEMENT elt;\
    	int offset;\
    	struct STRUCT_NODE_ ## ELEMENT *left;\
    	struct STRUCT_NODE_ ## ELEMENT *right;\
    } NODE_ ## ELEMENT;\
    \
    typedef NODE_ ## ELEMENT* AVL_ ## ELEMENT;\
    \
    ELEMENT* avl_find_ ## ELEMENT (AVL_ ## ELEMENT avl_tree, const ELEMENT elt) {\
            pfprintf(stderr,"avl_find\t");\
    	if (avl_tree == NULL) {\
                    pfprintf(stderr,"null\n");\
    		return NULL;\
    	} else {\
    		int cmp = avl_compareNode_ ## ELEMENT (avl_tree->elt,elt);\
    		if (cmp == 0) {\
                            pfprintf(stderr,"cmp = 0\n");\
    			return &(avl_tree->elt);\
    		} else if (cmp > 0) {\
                            pfprintf(stderr,"cmp > 0\n");\
    			return avl_find_ ## ELEMENT (avl_tree->left, elt);\
    		} else {\
                            pfprintf(stderr,"cmp < 0\n");\
                            return avl_find_ ## ELEMENT (avl_tree->right, elt);\
    		}\
    	}\
            return NULL;\
    } \
    ...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  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, mais tu peux utiliser le #ifdef pour une macro séparée et utiliser cette macro dans la grande.
    Par contre, si tu changes le define entre les deux, ça n'aura aucun effet...
    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
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    pas cool...

    pour ta réponse
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

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

Discussions similaires

  1. Commande dos qui nous envoie l'espace disque restant
    Par soulsidibe dans le forum Autres Logiciels
    Réponses: 14
    Dernier message: 09/06/2011, 00h09
  2. Afficher le "temps restant" sur une longue action
    Par illuzmax dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2005, 10h23
  3. Réponses: 2
    Dernier message: 15/06/2005, 18h01
  4. [PREPROCESSEUR] quelle difference ??
    Par chronos dans le forum C++
    Réponses: 11
    Dernier message: 05/05/2005, 19h15
  5. MP restant en boite d'envoi
    Par Sunchaser dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 01/05/2005, 00h29

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