Il n'y a pas une telle chose comme un complètement du code portable. :-)
Oui, il peut y avoir différentes octet/char tailles. Oui, il peut y avoir des C/C++ implémentations pour les plates-formes avec de très inhabituel valeurs de CHAR_BIT
et UCHAR_MAX
. Oui, parfois, il est possible d'écrire du code qui ne dépend pas de char de taille.
Cependant, presque tout le code réel, n'est pas autonome. E. g. vous avez peut-être d'écrire un code qui envoie les messages binaires sur le réseau (protocole n'est pas important). Vous pouvez définir les structures qui contiennent les champs nécessaires. Que vous avez à sérialiser. Juste binaire de la copie d'une structure dans une mémoire tampon de sortie n'est pas portable: en général, vous ne connaissez ni l'ordre des octets pour la plate-forme, ni de la structure des membres de l'alignement, de sorte que la structure tient juste les données, mais pas décrit la manière dont les données doivent être sérialisé.
Ok. Vous pouvez effectuer l'ordre des octets de transformations et de déplacer les membres de structure (par exemple, uint32_t
ou similaire) à l'aide d' memcpy
dans le tampon. Pourquoi memcpy
? Parce qu'il ya beaucoup de plates-formes où il n'est pas possible d'écrire des 32-bits (16 bits, 64 bits -- pas de différence) lorsque l'adresse de destination n'est pas correctement aligné.
Donc, vous avez déjà fait beaucoup pour atteindre la portabilité.
Et maintenant la dernière question. Nous avons une mémoire tampon. Les données sont envoyées au réseau TCP/IP. Ce réseau suppose octets de 8 bits. La question est: de quel type de la mémoire tampon doit être? Si vos caractères sont de 9 bits? Si elles sont en 16 bits? 24? Peut-être que chaque caractère correspond à un octet de 8 bits envoyés au réseau, et à seulement 8 bits sont utilisés? Ou peut-être plusieurs réseau octets sont emballés dans 24/16/9 bits caractères? C'est une question, et il est difficile de croire qu'il existe une réponse unique qui convient à tous les cas. Beaucoup de choses dépendent de la prise de la mise en œuvre de la plate-forme cible.
Alors, de quoi je parle. Habituellement, le code peut être relativement facilement portable, dans une certaine mesure. Il est très important de le faire si vous vous attendez à utiliser le code sur différentes plates-formes. Cependant, l'amélioration de la portabilité au-delà de cette mesure est une chose qui exige beaucoup d'efforts et donne souvent à peu, comme le code réel presque dépend toujours de l'autre code (socket mise en œuvre dans l'exemple ci-dessus). Je suis sûr que pour environ 90% du code de la capacité de travail sur les plates-formes avec des octets autre que le 8-bit est presque inutile, car il utilise de l'environnement qui est lié à 8 bits. Il suffit de vérifier la taille en octets et d'effectuer de temps pour la compilation de l'assertion. Vous seront presque certainement avoir à réécrire un lot pour une grande plate-forme inhabituelle.
Mais si votre code est très "autonome" -- pourquoi pas? Vous pouvez écrire dans une manière qui permet à différentes longueurs d'octets.