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

Bibliothèques, systèmes et outils C Discussion :

Problème de définition de byte


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut Problème de définition de byte
    Bonjour,

    j'ai un problème avec le type byte. Je reprend un programme linux que je porte sous Windows, avec MinGW.

    Dans le programme, j'ai la définition , et quand je compile, j'obtiens l'erreur suivante :
    c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/rpcndr.h:51:23: note: previous declaration of 'byte' was here
    Pas contrariant, je met mon code entre defined (je suis sous windows)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if defined(__unix)
    typedef int8_t byte;
    #endif
    D:\workspace\gel-HEAD\src\dwarf_line.c:3:2: error: expected specifier-qualifier-list before 'byte'
    Ce qui correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct local_t {
    // des types pour la struct
    	byte line_base;
    // d'autres types pour la struct
    } local_t;
    Donc, si je comprend bien, dans le premier cas j'ai deux définitions de byte, et dans le second j'en ai aucune.

    Le typedef se trouve dans un fichier h, inclus en tête du fichier c.

    Merci de votre aide.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #2
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    C'est peut-être parce que int8_t n'est pas défini sous windows?

    A+

    Pfeuh

  3. #3
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Il me semble que ça n'est pas ça, int8_t est défini dans stdint.h avec MinGW.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Internal types */
    typedef int32_t word;
    typedef uint32_t uword;
    typedef int16_t half;
    typedef uint16_t uhalf;
    #if defined(__unix)
    typedef int8_t byte;
    #endif
    typedef uint8_t ubyte;
    Mon code ressemble à ça, et dans le fichier de header minGW, tout ces types sont à côté les uns des autres, donc il serait bizarre que gcc trouve certains types mais pas d'autres.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    et si au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if defined(__unix)
    typedef int8_t byte;
    #endif
    tu mettais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef byte
    typedef int8_t byte;
    #endif
    ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    En essayer avec le ifndef byte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef uint16_t uhalf;
    #ifndef byte
    typedef int8_t byte;
    #endif
    typedef uint8_t ubyte;
    J'ai toujours l'erreur

    D:\workspace\gel-HEAD\src\/debug.h:34:16: error: conflicting types for 'byte'
    c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/rpcndr.h:51:23: note: previous declaration of 'byte' was here
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Il me semble que #ifdef/#ifndef n'est pas fait pour tester un typedef. j'ai essayé comme ça avec mon codeblocs/MinGW sur XP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdint.h>
    #ifndef __byte_defined
        typedef int8_t byte;
        #define __byte_defined
    #else
        #warning __byte_defined already defined
    #endif
     
    int main(int argc, char** argv)
    {
        int8_t toto = 234;
        toto++;
        return 0;
    }

  7. #7
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Apparemment, #ifdef et #ifndef ne fonctionnent qu'avec les constantes (#DEFINE)

    C'est pas gagné pour l'instant donc.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    Donc, si je comprend bien, dans le premier cas j'ai deux définitions de byte, et dans le second j'en ai aucune.
    Pas tout à fait. Dans le premier il existe une unité de compilation (i.e. pour faire simple un fichier source avec ces includes) dans laquelle le compilateur voit deux définitions de byte alors que dans le second il existe une unité de compilation (probablement une autre) dans laquelle il ne voit de définition de byte (l'include créant byte n'est pas inclus dans ce fichier source).

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    J'ajoute que le message en question ne nous renseigne pas sur la nature de « byte ». Il se pourrait très bien que ce soit un nom de variable et pas un nom de type, même si c'est peu probable, surtout dans un fichier *.h (sauf si extern).

    Par contre, RPC NDR est présenté ici : http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

    S'il est vraiment nécessaire de se trimbaler ce truc-là, il faudra composer avec. Comme il y a de fortes chances pour que ce fichier header définisse, comme les autres, sa propre garde, il faudra écrire un truc du genre :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef RPCNDR_H
    typedef int8_t byte;
    #endif

    A priori, je trouve que c'est ce qu'il y a de moins sale. Mais on pourra encore faire mieux car, dans ce cas, on risque de se retrouver avec une définition de « byte » dont le type est imprévisible.

  10. #10
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    Citation Envoyé par gl Voir le message
    Pas tout à fait. Dans le premier il existe une unité de compilation (i.e. pour faire simple un fichier source avec ces includes) dans laquelle le compilateur voit deux définitions de byte alors que dans le second il existe une unité de compilation (probablement une autre) dans laquelle il ne voit de définition de byte (l'include créant byte n'est pas inclus dans ce fichier source).
    En fait, tu m'indiques que j'ai deux fichiers sources qui utilisent mon .h (c'est le cas), et que byte est déjà défini dans l'un des deux. Donc avec mon typedef je me retrouve avec 2 définitions dans un fichier et 1 définition dans l'autre, ou 1 dans le premier fichier et zéro dans l'autre.

    C'est ça ?

    Edit : après essai, le test se fait sur
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par ManusDei Voir le message
    En fait, tu m'indiques que j'ai deux fichiers sources qui utilisent mon .h (c'est le cas), et que byte est déjà défini dans l'un des deux. Donc avec mon typedef je me retrouve avec 2 définitions dans un fichier et 1 définition dans l'autre, ou 1 dans le premier fichier et zéro dans l'autre.

    C'est ça ?
    Ou que byte est déjà défini dans un .h inclus (directement ou non) dans seulement un des deux fichiers source.

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

Discussions similaires

  1. [Système] Problème de définition des variables
    Par SLAM JACK dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2006, 19h53
  2. [Configuration] Problème sur définition de constante
    Par Yobs dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 24/03/2006, 11h40
  3. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  4. Réponses: 2
    Dernier message: 17/08/2005, 11h20
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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