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

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

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

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

/*  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 и вместо этого использовать стандартные типы, определенные в stdint.h, во всем моем коде (размеры теперь довольно хорошо стабилизировались)?


person James Morris    schedule 25.10.2009    source источник
comment
Взгляните на groups.google.com/group/comp. компиляторы/сообщение/   -  person kv-prajapati    schedule 25.10.2009
comment
Что вы имеете в виду, когда говорите, что с тех пор, как обнаружили, что это поведение на самом деле не определено?   -  person caf    schedule 26.10.2009
comment
@caf: хотя результат присвоения -1 беззнаковому типу хранения часто приводит к максимальному значению для этого типа, такое поведение не определено стандартом C и поэтому не гарантируется.   -  person James Morris    schedule 26.10.2009


Ответы (3)


  • Начните с поиска или создания версии <stdint.h>, если ваш компилятор ее еще не поддерживает.
  • После этого я бы рекомендовал создавать typedef для типов данных на основе их использования, а не их размера, если это вообще возможно. Кажется, у вас есть смесь размера типа данных (ss_t) и использования (lvl_t). Это, как правило, становится проблематичным, поскольку программисты просто выбирают один или другой произвольно или выбирают тот, который им проще всего ввести.
  • Удалите "_t" с конца. Глобальные идентификаторы, оканчивающиеся на _t, зарезервированы POSIX вместе с множеством других последовательностей.
person D.Shawley    schedule 25.10.2009
comment
Суффикс _t зарезервирован POSIX; это не ANSI или ISO. - person Adam Rosenfield; 25.10.2009
comment
@Adam: спасибо ... Наверное, поэтому я не смог найти его в своей копии ISO. Должно быть, вы прочитали это в Руководстве программиста POSIX. - person D.Shawley; 26.10.2009

Лично я бы определил все эти max_t и т. д. типы в терминах stdint.h типов:

typedef uint8_t map_t;

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

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

person ndim    schedule 25.10.2009

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

person Community    schedule 25.10.2009