1. #1
    Membre averti
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : février 2011
    Messages : 255
    Points : 419
    Points
    419
    Billets dans le blog
    1

    Par défaut Le gcc de Mingw impose les fonctions de windows.h

    Bonjour à tou(te)s,

    je viens d'installer une nouvelle version de Mingw et je ne suis pas contant !
    J'ai utilisé le mingw-get-setup.exe obtenu depuis https://sourceforge.net/projects/mingw/files (Looking for the latest version?).

    Je lance une compilation de mon code qui contient une fonction "DeleteFile".
    Et quand je l'appelle, ce nigaud croit que c'est celle de <windows.h> et me sort une erreur de mauvais paramètres.
    Dans son message d'erreur, je vois qu'il a remplacé "DeleteFile" par "DeleteFileA" ce qui prouve que windows.h est bien passé par là.
    C'est comme s'il incluait windows.h à mon insu.
    Dans ce même fichier j'inclus en revanche quelques headers de la stl.
    Ces derniers sont-ils les coupables ?
    Y a-t-il une espèce d'option cachée qui force l'inclusion des headers de windows ?
    Et pour info, avec mon ancienne version de Mingw (que j'ai bêtement perdue), le même code compilait sans problème...

    Votre aide serait la bienvenue !
    Merci d'avance
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 374
    Points : 37 837
    Points
    37 837

    Par défaut

    Je ne saurais pas te dire, mais au minimum pour ceux qui nous regardent, le workaround: Un #undef DeleteFile après les inclusions.

    En fait, tu peux même jouer avec l'ordre des inclusions et déplacer ton #undef DeleteFile jusqu'à ce que tu trouves le coupable...
    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
    Membre expérimenté
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 365
    Points : 1 590
    Points
    1 590

    Par défaut

    Je déconseille l'utilisation de #undef DeleteFile, surtout si c'est dans un ".h".
    Renomme plutôt ta fonction, par exemple en DeleteTheFile.

    Remarque : Le coupable n'est ni GCC, ni MinGW, mais la MFC.
    Quelle idée de définir une macro sans préfixe et pas entièrement en majuscules !
    Si cela avait été bien fait, la macro s'appellerait MFC_DELETE_FILE.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 374
    Points : 37 837
    Points
    37 837

    Par défaut

    MFC?

    MFC sur MinGW??

    De plus, le nom est nécessaire, parce que c'est un mapping de la fonction Win32 DeleteFile() vers les versions ASCII étendu et Wide.
    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.

  5. #5
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : janvier 2014
    Messages : 539
    Points : 2 598
    Points
    2 598

    Par défaut

    Bonjour,
    le problème au final est surtout d'utiliser un identifiant réservé sur la plateforme sur laquelle on développe. Le plus sain est de renommer la fonction écrite, un petit coup de refactorisation et hop.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 374
    Points : 37 837
    Points
    37 837

    Par défaut

    S'il n'inclut aucun header de l'API Windows, c'est qu'il ne développe pas pour Windows. Si MinGW inclut vraiment les headers Windows dans que ce soit demandé, c'est bel et bien un problème de MinGW.

    @ Captain'Flam: Utilises-tu des bibliothèques?
    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
    Membre averti
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : février 2011
    Messages : 255
    Points : 419
    Points
    419
    Billets dans le blog
    1

    Par défaut

    Merci à tous de vos réponses !

    Le coupable c'est MOI !

    En rajoutant moi même un #define DeleteFile foobar dans mon code, gcc m'a envoyé une erreur avec la succession d'inclusions qui mène à windows.h
    Et là, horreur, je constate qu'un petit malin dans mon équipe a trouvé "pratique" d'inclure windows.h pour pouvoir accéder à certaines fonctions de l'API.

    J'aurais dû creuser un peu plus avant de poster ici...

    Ma circonstance atténuante c'est que le problème s'est présenté au même moment que ma ré-installe de mingw.
    (pour info, nous développons sous Visual Studio pour le confort de cet EDI (+raisons historiques), mais notre code est destiné à être cross-compilé par un petit cousin de gcc.
    Donc, avant les livraison, je lance une compilation avec mingw/gcc pour vérifier que tout passe et profiter de ses warnings nettement plus "intelligents")

    Voilà, désolé de vous avoir dérangé ...
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : juin 2007
    Messages : 4 756
    Points : 15 441
    Points
    15 441

    Par défaut

    Encore une fois, les macros ont frappé.
    C'est entre autre pour ce type de problèmes qu'on déconseille très vivement les macros.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 374
    Points : 37 837
    Points
    37 837

    Par défaut

    Citation Envoyé par Captain'Flam Voir le message
    Le coupable c'est MOI !

    En rajoutant moi même un #define DeleteFile foobar dans mon code, gcc m'a envoyé une erreur avec la succession d'inclusions qui mène à windows.h
    Et là, horreur, je constate qu'un petit malin dans mon équipe a trouvé "pratique" d'inclure windows.h pour pouvoir accéder à certaines fonctions de l'API.
    En fait, le coupable serait plutôt le "petit malin" s'il a introduit une dépendance à l'API Windows alors qu'il n'y en avait pas avant...
    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 averti
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : février 2011
    Messages : 255
    Points : 419
    Points
    419
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Médinoc Voir le message
    En fait, le coupable serait plutôt le "petit malin" s'il a introduit une dépendance à l'API Windows alors qu'il n'y en avait pas avant...
    Surtout que la cible étant sous linux, en plus d'être moche, ça n'avait aucune chance de passer....
    Mais j'aurais dû chercher un peu plus avant de poster sur ce forum.
    Surtout qu'en fin de compte (avec l'astuce de créer un conflit à dessein (je m'en resservirai)) , ça m'a pris 5 min pour trouver le fichier qui faisait cette hideuse inclusion.
    Captain'Flam
    anciennement Sopsag, aka Hadrien
    Win seven 64 / Visual 2010 / Python 2.7 / Eclipse

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

Discussions similaires

  1. [C++/GCC] Ne pas instrumenter les fonctions de la lib standard
    Par Aspic dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 23/06/2013, 14h54
  2. doc sur les fonctions
    Par masterfab dans le forum C
    Réponses: 18
    Dernier message: 23/06/2005, 17h55
  3. Gcc et les fonctions
    Par fregolo52 dans le forum Linux
    Réponses: 9
    Dernier message: 09/08/2004, 18h55
  4. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  5. Réponses: 7
    Dernier message: 24/05/2003, 15h56

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