Comment rendre mes types de données indépendants du compilateur en c

J’étudiais uC / OS et lisais cet article:

Comme les différents microprocesseurs ont des longueurs de mots différentes, le port de μC / OS-II inclut une série de définitions de types garantissant la portabilité. non-portable. À la place, j’ai défini des types de données entiers à la fois portables et intuitifs, comme indiqué dans la liste 1.1. De plus, pour des raisons pratiques, j’ai inclus les types de données à virgule flottante même si μC / OS-II n’utilise pas de virgule flottante. Ce qui suit est la liste 1.1

typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned int INT16U; typedef signed int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64; #define BYTE INT8S #define UBYTE INT8U #define WORD INT16S #define UWORD INT16U #define LONG INT32S #define ULONG INT32U 

Mes questions sont:

1- Que veut dire l’auteur par la longueur des mots (les premiers mots en gras dans le corps de la question)?!

2- Pourquoi les types de données short int et long sont insortingnsèquement non portables.

3- Est-ce que typedef est une directive de microprocesseur, et si c’est quoi sa fonction?!

4- Puis-je écrire typedef unsigned char (anything) au lieu de typedef unsigned char INT8U;

5- Pourquoi l’auteur a-t-il typedef unsigned char INT8U; le code typedef unsigned char INT8U; et puis #define UBYTE INT8U je ne peux pas utiliser ce caractère directement typedef unsigned char UBYTE;

6- Il y a une double utilisation de typedef unsigned char un est typedef unsigned char INT8U; et l’autre typedef unsigned char BOOLEAN; Pourquoi a-t-il fait ça?!

1- Que veut dire l’auteur par longueur de mot?

Un mot est une unité fondamentale de la mémoire, comme une page . En fait, il existe également un article sur le mot , que je ne régurgiterai pas. Comme votre auteur le dit, l’importance pour C est que ce n’est pas toujours le même, mais que cela dépend des caractéristiques matérielles. C’est peut-être une des raisons pour lesquelles la norme C ne dicte pas la taille littérale des types de base; la plus évidente à envisager est la taille des pointeurs, qui seront de 4 octets sur les systèmes 32 bits et de 8 sur les systèmes 64 bits, afin de refléter la taille de l’espace d’adressage.

2- Pourquoi les types de données short int et long sont insortingnsèquement non portables.

Plus précisément: ils sont aussi portables que le C mais leur taille n’est pas normalisée, ce qui les rend inutilisables pour de nombreuses applications où une taille spécifique fixe est requirejse.

3- Est-ce que typedef est une directive de microprocesseur, et si c’est quoi sa fonction?!

Non, ce n’est pas une directive du processeur. C’est un bon morceau de sucre syntaxique qui vous permet de définir des types personnalisés.

4- Puis-je écrire typedef unsigned char (n’importe quoi) au lieu de typedef unsigned char INT8U;

Oui, c’est l’idée. Attention, le standard C ne dicte même pas la taille d’un caractère, bien que je n’ai jamais entendu parler d’une implémentation où il s’agit de tout sauf de 8 bits [mais que quelqu’un dans les commentaires a] .

5- Pourquoi l’auteur a-t-il tapé le code typedef char INT8U? et puis #define UBYTE INT8U, je ne peux pas utiliser ce caractère directement typedef unsigned char UBYTE;

Vous pourriez, oui. L’auteur a peut-être voulu limiter le nombre de places de ce type. Étant donné que l’utilisation de #define est une directive de pré-processeur, elle pourrait également légèrement rationaliser l’exécutable (mais pas dans une mesure qui pourrait être considérée comme généralement significative).

6- Il y a une double utilisation de typedef unsigned char dont l’un est typedef unsigned char INT8U; et l’autre typedef non signé char BOOLEAN; Pourquoi a-t-il fait ça?!

Encore une fois, l’utilisation de typedefs est beaucoup sur le “sucre”; ils peuvent rendre votre code plus propre, plus facile à lire et (en supposant qu’ils soient bien faits) plus robuste. “Boolean” est un terme CS dérivé des mathématiques pour un type qui n’a que deux valeurs significatives, zéro (faux) ou pas zéro (vrai). Donc, il pourrait en théorie être implémenté avec un seul bit, mais ce n’est ni facile ni finalement efficace (car il n’existe pas de processeurs avec des registres à un bit, il leur faudrait de toute façon couper les dés et les simuler). Définir un type “bool” ou “boolean” est courant en C et sert à indiquer que la signification de la valeur est vraie ou fausse – cela fonctionne bien avec, par exemple, if (var) (true) et if (!var) (false) puisque C évalue déjà de cette façon (0 et NULL sont les seules valeurs qui passeront if (!var) ). Tandis que l’utilisation de quelque chose comme INT8U indique que vous traitez avec une valeur comprise entre 0 et 255, car elle n’est pas signée. Je pense que la mise en U départ est une pratique plus courante ( UINT8 ), mais si vous êtes habitué aux concepts, cela est relativement clair. Et bien sûr, le typedef / define n’est pas difficile à vérifier.


À propos de stdint.h

Les types entiers sont ceux avec la plus grande plage de variation, et en fait, la norme ISO C exige qu’une implémentation inclue des définitions pour différents types entiers avec certaines tailles minimales dans stdint.h . Ceux-ci ont des noms comme int_least8_t . Bien sûr, les types avec une taille réelle fixe (pas seulement un minimum) sont nécessaires pour beaucoup de choses, et les implémentations les plus courantes les fournissent. La norme C99 stipule que si elles sont disponibles, elles doivent être accessibles via des noms suivant le modèle intN_t (signé) et uintN_t (non signé), où N est le nombre de bits. Les types signés sont également spécifiés en tant que complément à deux , de sorte que l’on peut utiliser ces valeurs de différentes manières.

Pour finir, bien que je ne sois pas familier avec MicroC, je ne prendrais pas cette documentation comme représentative de C en général – elle est destinée à être utilisée dans un environnement quelque peu ressortingctif et spécialisé (un int de 16 bits, impliqué implicitement par typedef , est inhabituel, et donc si vous exécutiez ce code ailleurs, INT16U pourrait être 32 bits, etc.). Je suppose que MicroC est uniquement conforme à la norme ANSI C, qui est la norme la plus ancienne et la plus minimale. évidemment il n’a pas stdint.h.