Использование typedefs (или #defines) для встроенных типов - какая-то разумная причина? - PullRequest
2 голосов
/ 14 мая 2009

Что ж, я делаю некоторую интеграцию с Java - C, и используются отображения типов библиотек C через werid (их больше;)):

#define CHAR        char                    /*  8 bit signed int            */
#define SHORT       short                   /* 16 bit signed int            */
#define INT         int                     /* "natural" length signed int  */
#define LONG        long                    /* 32 bit signed int            */
typedef unsigned    char    BYTE;           /*  8 bit unsigned int          */
typedef unsigned    char    UCHAR;          /*  8 bit unsigned int          */
typedef unsigned    short   USHORT;         /* 16 bit unsigned int          */
typedef unsigned    int     UINT;           /* "natural" length unsigned int*/

Есть ли законная причина не использовать их? Это не значит, что char будет переопределено в ближайшее время.

Я могу думать о:

  1. Написание переносимого кода платформы / компилятора (размер типа не указан в C / C ++)
  2. Экономия пространства и времени во встроенных системах - если вы зацикливаетесь на массиве короче 255 при записи 8-битного микропроцессора:

     for(uint8_t ii = 0; ii < len; ii++)
    

    даст измеримое ускорение.

Ответы [ 5 ]

4 голосов
/ 14 мая 2009

Именно в этом причина. C используется в ряде систем, и его довольно беспокоит то, как часто размеры шрифтов действительно меняются между платформами / оборудованием / версиями.

2 голосов
/ 14 мая 2009

Стандарт C не определяет размер ряда целочисленных типов; это зависит от компилятора и процессора, на котором будет выполняться код.

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

MISRA-C и другие используют uint16_t, sint32_t и т. Д. Более короткая форма, например, u16, s32 также используется.

Относительно #define v typedef: используйте typedef для принудительной проверки типа компилятором.

1 голос
/ 14 мая 2009

Q: Использование typedefs или #defines?

A: Ну, определяет это директивы препроцессора, но typedefs на самом деле работа, выполняемая компилятором. Лично я предпочитаю использовать typedefs для определений типов и определения для констант и оболочек функций и т. Д.

1 голос
/ 14 мая 2009

Ну, как вы сказали, есть еще .. Некоторые из них должны быть как INT32, так и INT64

int по умолчанию не имеет стандартного размера. Разрешается быть 32-битным или 64-битным.

поэтому наличие описанных выше объявлений помогает писать переносимый код, в котором можно сделать безопасные предположения, что INT32 всегда будет давать мне 32-битное целое число.

0 голосов
/ 14 мая 2009

Не только для переносимости между операционными системами, но и между архитектурами, например, между 32- и 64-разрядными машинами.

Представьте, что вы написали некоторый сетевой код на 32-разрядной машине, которая использовала два беззнаковых целых для хранения 64 последовательных битовых флагов. Скомпилируйте тот же код на 64-битной машине, и он практически гарантированно не будет работать, учитывая, что большинство 64-битных машин выделяют 8 байтов для целого числа, так что в итоге вы получили бы 128 битов и 32 бита между вашими два набора 32-битных флагов. Это, очевидно, очень плохо для мобильности.

На * nix машинах вы часто будете видеть typedef, которые конкретно указывают размер памяти, выделенной для этой переменной, например, uint16_t и uint32_t. Затем они typedef'd для любого типа, который дает вам столько неподписанного хранилища в конкретной архитектуре, поэтому ваш код может оставаться согласованным для всех операционных систем и архитектур.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...