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

Contribuez C++ Discussion :

[FAQ] Comment éviter les pièges qui font un programme non portable ?


Sujet :

Contribuez C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut [FAQ] Comment éviter les pièges qui font un programme non portable ?
    Bonjour,

    J'ai un peu du mal à trouver la bonne question. En même temps, Melem m'a dit que le sujet est très vaste. Je l'admet, mais tant que je n'aurais pas écrit l'article en question (ou quelqu'un d'autre ) je propose un récapitulatif des quelques points qui me viennent en tête.

    Question : Comment éviter qu'une application soit non portable ?
    Réponse :
    En fait, il est simple de faire en sorte qu'une application soit portable. Pour cela, il suffit de respecter quelques règles simples :

    • Éviter d'inclure les fichiers conio.h ou ceux liés à la WinAPI (tel que windows.h) ;
    • Éviter les include contenant le séparateur de chemin de fichier '\' (qui est autocomplété par VS2010) ;
    • Privilégiez les bibliothèques multiplateformes ;
    • Affichez les avertissements maximums des compilateurs (permet de se rapprocher de la norme du langage et donc d'être compatible avec plus de compilateurs)
    • Écrivez du code respectant la norme du langage et non du code qui compile par chance ;
    • Évitez les #pragma (même s'ils sont maintenant reconnus / ignorés par la plupart des compilateurs).





    ---


    Donc, voilà un premier essai. Je ne suis peut être pas le meilleur pour ce genre de choses.
    Petit rappel du pourquoi je trouve cette Q/R importante ->
    J'ai déjà vu du code sur le forum, ayant des #include <windows.h> alors que cette entête n'était pas nécessaire. Un peu pareil avec conio.h et sa superbe fonction getchar() :tronçonneuse:. Étant sous GNU/Linux (non, ce n'est pas pour troller), la conversion de leur code me prends du temps (pour voir que cela bogue à toute les lignes ). Alors qu'il suffit de respecter quelques règles simples pour avoir un programme portable.
    (Bon, ils me font aussi rager les gens qui disent que produire un programme portable est compliqué. Cela l'est que lorsque l'on commence par programmer sous Windows (bizarrement). La transition Linux -> Windows est largement plus simple à faire).
    Donc, après mon coup de rage ; le but final de cette FAQ (et peut être d'un article ?) est de faire en sorte que plus de programmeur fasse que leurs programmes compilent facilement sur tout les systèmes, donc, faisant que les programmes tournant sous GNU/Linux ou MAC OS X soit plus importants.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Même dans l'autre sens il y a des pièges, surtout avec POSIX, en gros MT et réseau (et les infos système ...). Mais aussi sur les démangling, l'affichage des exceptions qui se sont échappées, etc.
    (et ne pas oublier les 150 tests sur le support des (s)(n)printf, itoa & cie réalisés par les autotools.

    Privilégier les COTS portables au détriment des API limitées est en effet la première règle. Vu qu'il ont déjà fait abstraction des aspects propriétaires.

    Mais il y aurait quantité d'autres choses à détailler pour quand il y a besoin de faire ce boulot nous même. -> les points de variabilités à coup de #ifdef et ceux gérés au niveau des makefiles (qui vont choisir un fichier plutôt qu'un autre)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Le premier point a peut être l'air trivial mais mérite probablement d'être souligné : faire du code sans comportement indéfini ni comportement dépendant de l'implémentation du compilateur.
    Dans la même veine, éviter les extensions des compilateurs.

    #pragma est supposé être (silencieusement?) ignoré par les compilateurs qui ne supportent pas l'option, non ?

    Les COTS contraindront de toute façon la portabilité. Qt, wxWidget, POSIX ou Windows seront toujours de la science fiction quand on développe pour un v850 par exemple. Il faut donc éviter leur 'contagion' à des portions de code où ils ne sont pas utiles (c'est cette contagion que je reproche souvent aux framework type Qt ou MFC).

    Après tout dépend jusqu'où on pousse la portabilité. On peut aussi recommander de ne pas utiliser les types de bases ([signed|unsigned] char, [signed|unsigned] short, [signed|unsigned] int, [signed|unsigned] long, float, double) vu que le standard ne garantie pas de vrai représentation. Préférer alors les [u]intN_t. Mais ceux-ci ne sont disponibles qu'à partir de C++11 alors que déjà présent dans C99 (mais absent de C visual )

    Je pense qu'il y a encore d'autres recommandation et comme le dit Melem, c'est probablement assez vaste comme sujet. Les règles de codage ou les règles type MISRA visent justement à produite du code normalement plus portable.

    Puis, il y a les sujets tabous : doit-on vraiment faire de la programmation générique très poussée qui bien que conforme d'un point de vue standard peut donner du code non compilable par des compilateurs plus anciens ou moins conformes au standard. Ca peut être une vrai question et un vrai problème en industrie.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Je vois bien que je soulève un problème assez compliqué là.

    Pouvez vous me dire ce qu'est que les "COTS" ?

    Pour le #pragma oui, cela sera ignoré, mais du coup, le code ne sera pas interprété de la même façon, avec risque de programme ne se comportant plus pareil.


    Pourtant cela me dégoute toujours un peu, de voir qu'un programme pourrait fonctionner chez moi, pour quelques petits détails ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pouvez vous me dire ce qu'est que les "COTS" ?
    Le contraire du NIH


    COTS = commercial off-the-shelf = 'produit sur étagère', en gros bibliothèque tierce.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    On peut aussi recommander de ne pas utiliser les types de bases ([signed|unsigned] char, [signed|unsigned] short, [signed|unsigned] int, [signed|unsigned] long, float, double) vu que le standard ne garantie pas de vrai représentation. Préférer alors les [u]intN_t. Mais ceux-ci ne sont disponibles qu'à partir de C++11 alors que déjà présent dans C99 (mais absent de C visual )
    Non plus. Le C++11 standardise juste (u)fast_int{taille}_t (ou int_fast?) et pareil avec least.

    Et il y a deux aspects à considérer : la garantie de taille (min et max) pour les point d'interface (fichier binaire, socket). Et la garantie de taille (min) pour les calculs. Et parfois aussi le besoin de rapidité (le contrat de int, IIRC).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Comment éviter les pages blanches dans un état?
    Par Noline dans le forum Access
    Réponses: 2
    Dernier message: 31/07/2006, 17h30
  2. publipostage : comment éviter les doublons?
    Par Christophe93250 dans le forum Access
    Réponses: 15
    Dernier message: 03/01/2006, 13h08
  3. Réponses: 3
    Dernier message: 05/07/2005, 19h07
  4. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 13h18

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