Question

Cela semble être une question simple, mais je ne parviens pas à la trouver avec la recherche Stack Overflow ou Google. Que signifie un type suivi d'un _t? Tels que

int_t anInt;

Je vois beaucoup de choses dans le code C destiné à traiter étroitement le matériel & # 8212; je ne peux pas m'empêcher de penser qu'ils sont liés.

Était-ce utile?

La solution

Comme l’a noté Douglas Mayle, il s’agit essentiellement d’un nom de type. Par conséquent, il serait mal avisé de terminer les noms de variable ou de fonction par '_t', car cela pourrait créer une certaine confusion. En plus de size_t, la norme C89 définit wchar_t, off_t, ptrdiff_t et probablement quelques autres que j'ai oubliés. La norme C99 définit de nombreux types supplémentaires, tels que uintptr_t, intmax_t, int8_t, uint_least16_t, uint_fast32_t, <stdint.h>, etc. Ces nouveaux types sont formellement définis dans <inttypes.h> mais vous utiliserez le plus souvent printf() qui (exceptionnellement pour les en-têtes C standard) inclut scanf(). Il (<=>) définit également les macros à utiliser avec <=> et <=>.

Comme Matt Curtis l’a noté, le suffixe n’a aucune importance pour le compilateur; c'est une convention à caractère humain.

Cependant, vous devez également noter que POSIX définit un grand nombre de noms de types supplémentaires se terminant par ' <=> 'et réserve le suffixe pour la mise en œuvre. Cela signifie que si vous travaillez sur des systèmes liés à POSIX, il est déconseillé de définir vos propres noms de type avec la convention. Le système sur lequel je travaille l’a fait (plus de 20 ans); nous sommes régulièrement interpellés par des systèmes définissant des types portant le même nom que nous définissons.

Autres conseils

C’est une convention utilisée pour nommer les types de données, par exemple avec typedef:


typedef struct {
  char* model;
  int year;
...
} car_t;

Le _t entoure généralement une définition de type opaque.

GCC ajoute simplement les noms qui se terminent par foo_t à l'espace de nom réservé que vous ne pouvez pas utiliser, afin d'éviter tout conflit avec les versions futures de Standard C et POSIX (manuel de la bibliothèque GNU C) . Après quelques recherches, j'ai finalement trouvé la référence correcte dans la norme POSIX (1003.1, Explication (informative)):

  

B.2.12 Types de données

     

L'exigence selon laquelle les types supplémentaires définis dans cette section se terminent par & # 8216; & # 8216; _t & # 8217; & # 8217; a été invité par le   problème de pollution de l'espace par le nom. Il est difficile de définir un type (où ce type n’est pas un   défini par IEEE Std 1003.1-2001) dans un fichier d’en-tête et l’utiliser dans un autre sans ajouter de symboles   à l'espace de nom du programme. Pour permettre aux développeurs de fournir leurs propres types, tous   des applications conformes sont nécessaires pour éviter les symboles se terminant par & # 8216; & # 8216; _t & # 8217; & # 8217 ;, ce qui permet de   le réalisateur de fournir des types supplémentaires. Parce qu'une utilisation majeure des types est dans la définition de   membres de structure, qui peuvent (et doivent dans de nombreux cas) être ajoutés aux structures définies dans   IEEE Std 1003.1-2001, le besoin de types supplémentaires est impérieux.

En résumé, la norme indique qu'il existe de bonnes chances d'étendre la liste des types de norme. Par conséquent, la norme restreint le <=> espace de noms à son propre usage.

Par exemple, votre programme correspond à Problèmes POSIX 1003.1 6 et vous avez défini un type <=>. Les problèmes POSIX 1003.1 7 est finalement publié avec un nouveau type défini <=>. Votre programme ne correspond pas à la nouvelle version, ce qui pourrait poser problème. Restreindre l'utilisation <=> empêche de refactoriser le code. Ainsi, si vous visez une conformité POSIX, vous devez absolument éviter le <=> comme le dit la norme.

Note latérale: personnellement, j'essaie de m'en tenir à POSIX car je pense que cela donne de bonnes bases pour une programmation propre. De plus, j'aime beaucoup les Style de codage Linux (chapitre 5) . Pourquoi ne pas utiliser typedef? J'espère que cela vous aidera!

Il s’agit d’une convention de dénomination standard pour les types de données, généralement définie par typedefs. Une grande partie du code C qui traite des registres matériels utilise des noms standard définis par C99 pour les types de données de taille fixe signés et non signés. Par convention, ces noms sont dans un fichier d’en-tête standard (stdint.h) et se terminent par _t.

Le _t n’a intrinsèquement aucune signification particulière. Mais il est devenu courant d’ajouter le suffixe i à typedef.

Vous connaissez peut-être mieux les pratiques courantes du C en matière de nommage des variables ... Ceci est similaire à la façon habituelle de coller un pointeur à l'avant pour un pointeur et d'utiliser un trait de soulignement devant des variables globales (c'est un peu moins commun) et d’utiliser les noms de variable j, k et BYTE pour les variables de boucle temporaires.

Dans le code où la taille et l'ordre des mots sont importants, il est très courant d'utiliser des types personnalisés définis qui sont explicites, tels que WORD DWORD (normalement 16 bits) int_t (32 bits).

int n'est pas très bon, car la définition de <=> varie d'une plate-forme à l'autre - donc à qui <=> vous conformez-vous? (Bien que, de nos jours, la plupart des projets de développement centrés sur le PC le traitent en 32 bits, la plupart des éléments destinés au développement autre que sur PC traitent toujours les int en tant que 16 bits).

C'est juste une convention qui signifie & "; tapez &"; Cela ne signifie rien de spécial pour le compilateur.

Cela signifie le type. size_t est le type de taille.

Il y avait quelques bonnes explications sur le sujet. Juste pour ajouter une autre raison pour redéfinir les types:

Dans de nombreux projets intégrés, tous les types sont redéfinis pour indiquer correctement le dimensionnement donné et pour améliorer la portabilité sur différentes plates-formes (par exemple, des compilateurs de types de matériel).

Une autre raison sera de rendre votre code portable sur différents systèmes d’exploitation et d’éviter les conflits avec les types existants dans le système d’exploitation que vous intégrez dans votre code. Pour cela, un préfixe unique (si possible) est généralement ajouté.

Exemple:

typedef unsigned long dc_uint32_t;

Si vous utilisez du code d'interface matérielle, l'auteur du code que vous consultez peut avoir défini int_t comme étant un entier de taille spécifique. Le standard C n'attribue pas de taille spécifique au type int (cela dépend éventuellement de votre compilateur et de votre plate-forme cible), et l'utilisation d'un type <=> spécifique éviterait ce problème de portabilité.

Il s'agit d'une considération particulièrement importante pour le code d'interface matérielle, ce qui peut expliquer pourquoi vous avez tout d'abord remarqué la convention.

Par exemple, dans C99, /usr/include/stdint.h:

typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int            uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int       uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

_t signifie toujours défini par typedef.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top