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 :

Les conditions des préprocesseurs


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 12
    Points
    12
    Par défaut Les conditions des préprocesseurs
    Bonjour,

    Voila j'en suis rendus au cours sur les préprocesseur mais je bloque sur la mise en application des conditions des prépocesseurs. En effet je ne sais pas vraiment comment faut coder la chose a part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #if Condition
    /* Code de la condition*/
    #elif
    /*Code*/
    #endif
    Mais a la place de "/*Code..*/ que faut-il mettre?

    J'ai pour exemple de faire une application multi-langues:
    Anglais pour la communauté internationale.
    Français pour le fun.

    Comment dois-je construire mon programme en connaissant le publique ciblé?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define LANG ENGB
     
    #if LANG ENGB
    /* ...*/
    #elif
    /* ... */
    #endif
    Mais pour remplacer les "..." je dois balancer ton mon programme anglais?

    J'attend vos conseils merci.

  2. #2
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut !


    Voici un exemple (d'un de mes projet) d'un bloc de code en préprocesseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define BEGIN_TABLE_GET_LOOP              \
       if (table != NULL && id != NULL)       \
       {                                      \
          C_Str_table * t = table;            \
                                              \
          while (t != NULL)                   \
          {                                   \
             if (strcmp (t->id, id) == 0)     \
             {
    Si tu veux passer une application en multilingue je te conseil d'utiliser une petite bibliothèque comme par exemple gettext. En aucun cas tu vas créer une application multilingue avec le préprocesseur, trop fastidieux et carrément pas fait pour ca

    L'exemple de préprocesseur que je t'ai montré est par exemple utile comme dans mon cas ci-dessus, à éviter de devoir retaper mainte fois le même code, certaines de mes boucles étant identiques sauf leur corps. Voici un exemple concret dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const char * C_Str_table_get_string (C_Str_table * table, const char * id)
    {
       const char * ret = NULL;
     
     
       BEGIN_TABLE_GET_LOOP
             ret = t->s_data;
       END_TABLE_GET_LOOP
     
     
       return ret;
    }
    C'est une utilisation possible du préprocesseur

    Alors soit tu utilises gettext soit tu te créé ta petite bibliothèque pour gérer plusieurs langues dans ton programme. gettext est une bonne alternative car pour le cas où tu le savais pas, un programme multilingue ne touche pas uniquement sur les textes affichés à l'écran mais aussi par exemple sur la façon d'afficher des valeurs comme c'est également décrit dans la doc de gettext par exemple:
    Numbers can be represented differently in different locales. For example, the following numbers are all written correctly for their respective locales:

    12,345.67 English
    12.345,67 German
    12345,67 French
    1,2345.67 Asia

    Some programs could go further and use different unit systems, like English units or Metric units, or even take into account variants about how numbers are spelled in full.
    Si maintenant tu n'affiches que du texte tu peux toujours te concocter ta bibliothèque ou en utiliser une autre, regarde un peu comment j'ai fait la mienne (elle ne sert qu'à afficher du texte c'est tout, sinon il faut utiliser gettext à la place): http://franckh.developpez.com/clang/
    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 !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Pourquoi sur certains tutos y'a écrit qu'il faut pas utiliser les accolade en prépoc?
    Et il préconise d'utiliser un dérivé pour pour faire du multi-plateforme c'est pire que du multi langue non?

  4. #4
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Ququbs Voir le message
    Pourquoi sur certains tutos y'a écrit qu'il faut pas utiliser les accolade en prépoc?
    Il disent
    Vous noterez qu'il n'y a pas d'accolades en préprocesseur.
    En effet, les conditions sous la forme préprocesseur il n'y pas d'accolade, suivant leur exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if condition
        /* Code source à compiler si la condition est vraie */
    #elif condition2
        /* Sinon` si la condition 2 est vraie` compiler ce code source */
    #endif
    mais ca ne vaut que pour cette forme là, ce que tu écrit dans le corps de chaque condition sera sous la même forme que lorsque tu écrit du code normal comme je te l'ai montré, tu ne peut pas écrire par exemple:
    ce qui serait faux et ce qu'ils ont voulu dire dans leur tutoriel

    Citation Envoyé par Ququbs Voir le message
    Et il préconise d'utiliser un dérivé pour pour faire du multi-plateforme c'est pire que du multi langue non?
    Le préprocesseur sert souvent à écrire des programme multi-plateforme. Cela vaut surtout pour l'utilisation de fonctions spécifiques à l'OS pour lequel le programme sera compilé, un exemple de bloc possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if defined (LINUX)
       /* fonction (ou autre chose) spécifque à Linux */
    #elif defined (WIN32)
       /* fonction (ou autre chose) spécifque à Windows */
    #endif
    A noter que tu peux mettre du préprocesseur à peu près partout dans ton code
    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 !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    T'as pas un exemple comme eux ils font s'il te plait? =p

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #if condition
     
    #elif condition 2
    #endif

  6. #6
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Bin en partant de ton but d'internationalisation, un exemple parmi tant d'autre:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define FRENCH_VERSION 1
    #define ENGLISH_VERSION 0
     
     
    int main (void)
    {
    #if (FRENCH_VERSION == 1)
       char * txt = "Bonjour !";
    #elif (ENGLISH_VERSION == 1)
       char * txt = "Hello !";
    #endif
     
       printf ("%s\n", txt);
     
       return EXIT_SUCCESS;
    }
    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 !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Points : 12
    Points
    12
    Par défaut
    Enfait, le truc qui marcher pas dans mon code c'est que je fesais le #if etc, en dehors d'une fonctions merci.

  8. #8
    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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Ququbs Voir le message
    Enfait, le truc qui marcher pas dans mon code c'est que je fesais le #if etc, en dehors d'une fonctions merci.
    C'est faisable également en dehors de toute fonction. C'est le plus souvent utilisé dans ce cas par exemple pour la mise en place de constantes (ou autre macros, etc...) suivant la plate-forme cible.
    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. utilisation des noms des variables dans les conditions
    Par ankhaline dans le forum SAS Base
    Réponses: 4
    Dernier message: 14/08/2010, 14h34
  2. LEFT JOIN et les places des tables dans la condition
    Par moukit233 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/01/2010, 09h08
  3. Réponses: 1
    Dernier message: 11/11/2009, 14h08
  4. Réponses: 3
    Dernier message: 01/07/2008, 16h51
  5. Réponses: 1
    Dernier message: 03/11/2005, 14h21

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