Рекомендуемый подход к typedefs для стандартных типов в C? - PullRequest
1 голос
/ 25 октября 2009

Каков рекомендуемый подход к typedefs для стандартных типов в C?

Например, в начале моего проекта я создал typedef, чтобы использовать наименьшие типы, возможные для их цели. Основное намерение состояло в том, чтобы позволить легко модифицировать типы в случае, когда используемые числовые диапазоны стали слишком большими для типа без необходимости выполнять глобальный поиск + замена по всему проекту. Но через шесть месяцев я не удовлетворен и думаю, что должен быть лучший путь.

Это типы, которые я определил:

/*  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;
};

В некотором коде вместо использования подписанного типа и проверки для n < 0 && n > max_val используется неподписанный тип и выполняется проверка только для n > max_val, где max_val меньше T_MAX, хотя с тех пор я обнаружил, что это поведение на самом деле не определено .

Должен ли я удалить все эти typedef s и использовать стандартные типы, определенные в stdint.h, вместо этого по всему моему коду (размеры теперь довольно хорошо стабилизировались)?

Ответы [ 3 ]

3 голосов
/ 25 октября 2009

Я бы лично напечатал все эти max_t и т. Д. Типы в терминах stdint.h типов:

typedef uint8_t map_t;

Помимо двух «разных» типов, я бы сам использовал аналогичный подход - со всеми предупреждениями и ошибками компилятора, касающимися целочисленных преобразований и включенных сравнений.

Полагаю, вам нужно будет переключать языки программирования, если вы хотите более точные определения типов и использовать Ada:)

2 голосов
/ 25 октября 2009
  • Начните с поиска или создания версии <stdint.h>, если ваш компилятор уже не поддерживает ее.
  • После этого я бы порекомендовал создать typedef s для типов данных, основанных на их использовании, а не их размере, если это вообще возможно. Похоже, у вас есть смесь размера типа данных (ss_t) и использования (lvl_t). Это может стать проблематичным, так как программисты просто выбирают одно или другое произвольно или выбирают тот, который они находят наиболее простым для ввода.
  • Снимите «_t» с конца. Глобальные идентификаторы, оканчивающиеся на _t, зарезервированы POSIX вместе с множеством других последовательностей.
0 голосов
/ 25 октября 2009

Я советую вам, чтобы вы сохраняли typedef как есть, до тех пор, пока они используются последовательно. Наличие этих typedefs может быть большим подспорьем в рефакторинге вашей программы в будущем.

...