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 :

#define sur plusieurs fichiers


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 56
    Points : 47
    Points
    47
    Par défaut #define sur plusieurs fichiers
    voilà je suis entrain de faire un programme en plusieurs fichiers...
    dont un qui s'occupe de récuprer les arguments de ma comande.

    arg.c
    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
     
    #include "arg.h"
     
    extern char *interface;
     
     
    void initvars(int argc, char **argv)
    {
    int arg;
    extern char *optarg;
    extern int optind, optopt;
     
     
    while ((arg = getopt(argc, argv, ":i:f:")) != -1)
            {
            switch(arg)
                    {
                    case 'i': 
                      #define ARG_INTERFACE
    		  interface = optarg;
    		break;
                    default:
                    break;
                    }
            }
    }
    donc le principe c ke si il ya un argument apres "-i" alors je defini une contante interface.
    que j'utilise dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "main.h"
    extern char *interface;
     
    [...]	#ifndef ARG_INTERFACE
    	#define ARG_INTERFACE
    	printf("ARG_INTERFACE pas defini");	
            //interface = pcap_lookupdev(errbuf);
    	#endif
    donc quand j'execute : ./prog -i eth1
    tout va bien
    mais si j'execute ./prog
    il ne m'affiche même pas mon printf !

    merci pour votre aide !!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: #define sur plusieurs fichiers
    Citation Envoyé par [thebadskull
    ]voilà je suis entrain de faire un programme en plusieurs fichiers...
    dont un qui s'occupe de récuprer les arguments de ma comande.

    arg.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <...>
                      #define ARG_INTERFACE
    <...>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    &#91;...&#93;	#ifndef ARG_INTERFACE
    	#define ARG_INTERFACE
    	printf&#40;"ARG_INTERFACE pas defini"&#41;;	
            //interface = pcap_lookupdev&#40;errbuf&#41;;
    	#endif
    Petits rappels :
    • Une macro opère une substitition de caractères dans les premières phases de la compilation.
    • Lorsqu'une macro est définie, on peut la tester avec #ifdef ou ifndef ou # if defined ()
    • Il est possible d'annuler une definition avec #undef
    • La portée d'une macro commence avec sa définition et se termine par #undef ou la fin de l'unité de compilation courante.
    • Il est bien sûr possible de placer une définition de macro dans un header (.h). Dans ce cas, la portée est étendue à tous les fichiers incluant cet header.

    C'était quoi déjà la question ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    là question est : pourquoi ça marche pas???

    nan mais je fai mon define dans arg.c ce define defini si j'ai mis mon argument

    et dans le main je fai: si c'est deja défini je fai rien sinon j'initialise ma variable
    le pbm est que il rentrer jamais dans le ifndef mm quand je met pas d'argument

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par [thebadskull
    ]là question est : pourquoi ça marche pas???

    nan mais je fai mon define dans arg.c ce define defini si j'ai mis mon argument

    et dans le main je fai: si c'est deja défini je fai rien sinon j'initialise ma variable
    le pbm est que il rentrer jamais dans le ifndef mm quand je met pas d'argument
    As-tu lu mes rappels ? Qu'est-ce que tu n'as pas compris ? Tu définis une macro dans une unité de compilation, et tu la testes dans une autre. Ca ne peux pas marcher. En plus, comme je me tue à l'expliquer, l'action d'une macro est statique. Elle agit à la compilation et non à l'exécution. Les portions de macros 'non définies' ne seront tout simplement pas compilées du tout.

    En d'autres termes, ton code est mal conçu. Tu dois sans doute utiliser une variable ou un paramètre pour faire ce que tu veux.

    La pratique courante avec les options de la ligne de commande est de définir une structure de configuration où les élements sont mis à une valeur par défaut cohérente, puis, si l'option existe, de modifier les éléments concernés de la structure. Ensuite, l'adresse de la structure est transmise (en lecture seule) aux fonctions qui en ont besoin.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 56
    Points : 47
    Points
    47
    Par défaut
    merci bien pour ton aide !!

    Au lieu d'inclure mon fichier .h , est-il possible d'inclure directement mon arg.c dans mon main, comme ça la macro sera étendue non?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par [thebadskull
    ]merci bien pour ton aide !!

    Au lieu d'inclure mon fichier .h , est-il possible d'inclure directement mon arg.c dans mon main, comme ça la macro sera étendue non?
    Non. On n'inclue pas de .c dans un .c. C'est techniquement possible mais c'est une pratique detestable. Les .h (avec leurs gardes contre les inclusions multiples) sont là pour ça.

    Regle de conception de base :

    - interface : .h
    - implementation : .c

    c'est aussi simple que ça. A lire en entier:

    http://emmanuel-delahaye.developpez.com/codage.htm
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Find and replace sur plusieur fichiers
    Par dazhoid dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/08/2006, 17h18
  2. Macros sur Plusieurs fichiers Excel
    Par Echizen1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2006, 12h21
  3. Sed sur plusieurs fichiers
    Par gangsoleil dans le forum Linux
    Réponses: 4
    Dernier message: 21/02/2006, 12h55
  4. Réponses: 4
    Dernier message: 03/12/2004, 12h18
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 12h45

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