Il semble y avoir deux notions orthogonales de "portabilité" :
-
Mon code se compile partout sans problème. Son comportement général est le même sur toutes les plateformes, mais les détails des fonctionnalités disponibles varient en fonction des caractéristiques de la plateforme.
-
Mon code contient un dossier pour les éléments dépendant de l'architecture. Je garantis que MYINT32 est toujours 32 bits, quoi qu'il arrive. J'ai réussi à transposer la notion de 32 bits aux lummoxes à fourrure à neuf doigts de Mars.
Dans la première approche, nous écrivons unsigned int n;
y printf("%u", n)
et nous savons que le code fonctionne toujours, mais des détails comme la gamme numérique de unsigned int
sont du ressort de la plate-forme et ne nous concernent pas. ( Wchar_t entre en jeu ici aussi). C'est ce que j'appellerais le style véritablement portable.
Dans la deuxième approche, nous définissons tout et utilisons des types comme uint32_t
. Sortie formatée avec printf
déclenche des tonnes d'avertissements, et nous devons recourir à des monstres comme PRI32
. Cette approche nous procure un étrange sentiment de puissance et de contrôle en nous permettant de savoir que notre entier a toujours une largeur de 32 bits, mais j'hésite à qualifier cette approche de "portable" : elle est tout simplement têtue.
Le concept fondamental qui nécessite une représentation spécifique est sérialisation : Le document que vous écrivez sur une plateforme doit être lisible sur toutes les autres plateformes. La sérialisation est naturellement l'endroit où l'on renonce au système de types, où l'on doit s'inquiéter de l'endive et où l'on doit décider d'une représentation fixe (y compris des choses comme l'encodage du texte).
Le résultat est le suivant :
- Écrivez le noyau de votre programme principal dans un style portable en utilisant des primitives de langage standard.
- Écrire des interfaces d'E/S propres et bien définies pour la sérialisation.
Si vous vous en tenez à cela, vous ne devriez même pas avoir à vous demander si votre plate-forme est 32 ou 64 bits, big ou little endian, Mac ou PC, Windows ou Linux. Respectez la norme, et la norme vous suivra.