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 :

Directives du préprocesseur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut Directives du préprocesseur
    Bonjour,

    D'abord, chose important je pense, j'utilise Cbuilder6

    Je recherchais sur le net les différentes directives que l'on peut utiliser avec le préprocesseur, car je voulais éviter un éventuel plantage de mon programme qui aurait eu lieu suite à une erreur de dimensionement d'un tableau.

    Sur ce site, je trouve cette information, ainsi qu'une similitude sur le site MSDN:
    The constant-expression is an integer constant expression with these additional restrictions:

    Expressions must have integral type and can include only integer constants, character constants, and the defined operator.

    The expression cannot use sizeof or a type-cast operator.
    Je décide néanmoins de tester ça avec le bout de code suivant:
    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
    typedef struct {
    	SDL_Surface *button;
    	SDL_Rect coo;
    	int alpha;
    } s_button;
     
    s_button button[4];
     
    void fct(....)
    {
    	char *btext[]={"Sélection des folders","Folder sélectionnés","Générer les archives","Quitter"};
     
    #if sizeof(btext)/sizeof(char *)!=sizeof(button)/sizeof(s_button)
    #error Invalid size for btext
    #endif
    ...
    Je m'attend à recevoir un message me disant que ma directive n'es pas correcte mais, à ma grande surprise, pas un seul message d'erreur.

    Je change donc le code en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void fct(...)
    {
    	char *btext[]={"Sélection des folders","Folder sélectionnés","Générer les archives","Quitter","blabla"};
     
    #if sizeof(btext)/sizeof(char *)!=sizeof(button)/sizeof(s_button)
    #error Invalid size for btext
    #endif
    ...
    ... et ma compilation m'affiche:
    Fatal xxxx Error directive: Invalide size for btext in function ...
    Cela génère également une erreur si, pour le premier exemple, l'indice est <> 4

    Ma question est donc: le traitement des sizeof par le préprocesseur est-il spécifique à Cbuilder6, ou les préprocesseurs ont-il été modifiés depuis que les articles ont été postés sur le net?

    Remarque: personnellement, ça m'arrange bien, vu ma grande distraction...

    Edgar.

  2. #2
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Bonjour,

    D'abord, chose important je pense, j'utilise Cbuilder6

    ...

    Je m'attend à recevoir un message me disant que ma directive n'es pas correcte mais, à ma grande surprise, pas un seul message d'erreur.

    ...

    Ma question est donc: le traitement des sizeof par le préprocesseur est-il spécifique à Cbuilder6, ou les préprocesseurs ont-il été modifiés depuis que les articles ont été postés sur le net?

    Remarque: personnellement, ça m'arrange bien, vu ma grande distraction...

    Edgar.
    Essaye pour voir avec sizeof(UnTypeProgrammé), un type à toi, pas prédéfini par le langage. Là, ça marche peut-être juste parce q'uil connaît d'avance.

    Denis

  3. #3
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Hello denispir,

    s_button est un type que le langage n'est pas censé connaitre, car pas dans les types de base du C.

    Edgar.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    printf("%d", sizeof(s_bouton)); devrait marcher au moment de l'exécution, je ne vois pas pourquoi le sizeof(s_bouton) ne marcherais pas au niveau du compilateur. s_bouton étant définie comme un type le compilateur peut facilement déduire sa taille : taille_s_bouton = sizeof(SDL_Surface *) + sizeof(SDL_Rect) + sizeof(int);.



    Ce que je ferais, c'est que j'afficherais le résultat de chaque sizeof() pour voir sur quels sizeof() on trouve des incohérences.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if sizeof(btext)/sizeof(char *)!=sizeof(button)/sizeof(s_button)
    sizeof(btext) -> 5 * sizeof(char *)
    sizeof(btext)/sizeof(char *) -> 5


    sizeof(button) -> 4 * sizeof(s_bouton)


    sizeof(button)/sizeof(s_button) -> 4


    Donc si tu ne veux pas qu'il y ai d'erreur, tes deux tableaux doivent avoir le même nombre d'éléments.

  5. #5
    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
    @Neckara
    taille_s_bouton = sizeof(SDL_Surface *) + sizeof(SDL_Rect) + sizeof(int);.
    Ce n'est absolument pas garanti.

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Hello,

    Au niveau des sizeof, je n'ai aucun problème, de même que pour accorder les tailles des tableaux à remplir avec le nombre d'élements que je souhaite y mettre.

    Ma question était
    le traitement des sizeof par le préprocesseur est-il spécifique à Cbuilder6, ou les préprocesseurs ont-il été modifiés depuis que les articles ont été postés sur le net?
    Par exemple, GCC va-t-il accepter ce genre de directive? (je n'ai ni gcc ni vc sous la main pour le tester)

    Dans l'exemple que j'ai donné, distrait comme je suis, je suis capable de rajouter un élément à btex[] en oubliant de modifier la taille de button[]; c'est un simple garde-fou (voilà un mot qui décrit bien la situation!)

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai testé pour toi un code proche de celui posté au message #1 :

    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>
     
    typedef struct {
    	char *button; // pas de SDL chez moi ^^
    	char coo;
    	int alpha;
    } s_button;
     
    s_button button[4];
     
     
    #if sizeof(btext)/sizeof(char *)!=sizeof(button)/sizeof(s_button)
    #error Invalid size for btext
    #endif
     
    int main()
    {
        return 0;
    }
    Je le compile avec CodeBlocks sous XP (donc le comportement de gcc normalement) et j'obtiens :
    d:\...\developpez.c|13|error: missing binary operator before token "("|
    ||=== Build finished: 1 errors, 0 warnings ===|

    @Neckara :
    je ne vois pas pourquoi le sizeof(s_bouton) ne marcherais pas au niveau du compilateur
    Le problème est ici de savoir s'il marche lors du passage du pré-processeur, donc avant la compilation.

  8. #8
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut
    Citation Envoyé par Bktero Voir le message
    @Neckara :

    Le problème est ici de savoir s'il marche lors du passage du pré-processeur, donc avant la compilation.
    Oui, c'est exactement ça : le préprocesseur (au sens des macros C) n'est pas sensé avoir une connaissance du langage (comme le sens de sizeof, ou la taille de divers types). C'est forcément un point ajouté par certaines implantations et donc non portable par définition. Sauf si tu limites tes cibles à des plate-formes sur lesquelles les compilos courants font tous pareil, au-delà de la norme. (Mais comme c pas dans la norme, ils pourraient changer ça.)

    Denis

  9. #9
    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
    Cela semble être une extension de Cbuilder6, et absolument pas standard vu que pour le standard, le préprocesseur est censé pouvoir tourner entièrement sans compilation aucune (vu que le préprocessing a lieu avant la compilation).
    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.

  10. #10
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Hello,

    Par exemple, GCC va-t-il accepter ce genre de directive? (je n'ai ni gcc ni vc sous la main pour le tester)
    Si tu me passes en privé un bout de code complet qui marche chez toi, je veux bien le tester sur gcc et te dire ce qu'il en est. Dans ce cas envoie-moi le source (paqueté s'il y a plusieurs fichiers) à denis point spir chez gmail point com.
    Mais note que ça te donnera pas une assurance de portabilité (au-delà du fait que gcc est presque une norme de fait).

    denis

Discussions similaires

  1. préprocesseur : directives imbriquées
    Par ol9245 dans le forum C
    Réponses: 1
    Dernier message: 08/05/2015, 12h16
  2. Réponses: 13
    Dernier message: 02/08/2009, 19h06
  3. [C de base] Directive Préprocesseur
    Par Altrensa dans le forum Débuter
    Réponses: 5
    Dernier message: 19/10/2008, 02h09
  4. Directive préprocesseur #define
    Par Altrensa dans le forum C
    Réponses: 12
    Dernier message: 29/11/2007, 17h53
  5. Réponses: 6
    Dernier message: 19/02/2007, 11h13

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