Question

Quelle est l'approche recommandée pour les types de caractères pour les types standard en C?

Par exemple, au début de mon projet, j'ai créé des typedefs pour utiliser les types les plus petits possibles. L'intention principale était de permettre une modification facile des types dans le cas où les plages numériques utilisées devenaient trop grandes pour le type sans avoir à effectuer une recherche globale + remplacer sur l'ensemble du projet. Mais après six mois, je ne suis pas satisfait et pense qu’il doit y avoir un meilleur moyen.

Ce sont les types que j'ai définis:

/*  type to be used for storing map data within
    n*n array                                   */
typedef unsigned char map_t;

/*  type to be used for storing coordinates in map.
    min 0,max 32 (MAP_W,MAP_H defaults). note: no
    longer requires signed.                     */
typedef unsigned char xy_t;

/*  type to be used for counters, ie moves_remaining
    has max 2000                                */
typedef signed int ctr_t;

/*  type to be used for storing the level number,
    requires signed.                            */
typedef signed short lvl_t;

/*  type to be used for storing contact types,
    see actions.h CONTACT                       */
typedef signed short ct_t;

/*  small unsigned type, miscellaneous          */
typedef unsigned char su_t;

/*  small signed type, miscellaneous            */
typedef signed char ss_t;

struct xy
{
    xy_t x;
    xy_t y;
};

struct scrxy
{
    int x;
    int y;
};

struct xy_offset
{
    ss_t x;
    ss_t y;
};

Certains codes, au lieu d'utiliser un type signé et de rechercher n < 0 && n > max_val, utilisent un type non signé et ne vérifient que n > max_valmax_val est inférieur à T_MAX bien que j'aie découvert depuis que ce comportement était en réalité indéfini. .

Devrais-je supprimer tous ces typedef s et utiliser les types standard définis dans stdint.h tout au long de mon code (les tailles se sont assez bien stabilisées maintenant)?

Était-ce utile?

La solution

  • Commencez par rechercher ou créer une version de <stdint.h> si votre compilateur ne la prend pas déjà en charge.
  • Après cela, je vous recommande de créer typedef s pour les types de données en fonction de leur utilisation et non de leur taille, dans la mesure du possible. Vous semblez avoir un mélange de taille de type de données (ss_t) et d'utilisation (lvl_t). Cela tend à devenir problématique car les programmeurs choisiront indifféremment l’un ou l’autre ou choisir celui qu’ils trouvent le plus facile à taper.
  • Retirez le " _t " à partir de la fin. Les identificateurs globaux se terminant par <=> sont réservés par POSIX avec une foule d'autres séquences.

Autres conseils

Je saisirais personnellement tous ces types max_t etc. en termes de stdint.h types:

typedef uint8_t map_t;

Hormis les deux " divers " types, j'utiliserais moi-même une approche similaire: tous les avertissements et toutes les erreurs du compilateur concernant les conversions et les comparaisons d'entiers sont activés.

Je suppose que vous devrez changer de langage de programmation si vous voulez des définitions de type plus précises et utiliser Ada:)

Mon conseil est que vous devriez conserver les types de caractères tels quels, à condition qu'ils soient utilisés de manière cohérente. Avoir ces types de caractères peut être d'une grande aide pour refactoriser votre programme à l'avenir.

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