Какова цель этих `typedef`? - PullRequest
1 голос
/ 26 мая 2011
typedef intptr_t        ngx_int_t; 
typedef uintptr_t       ngx_uint_t; 
typedef intptr_t        ngx_flag_t;

Что мы можем извлечь из этого? Я не могу думать о том, чтобы быть честным ...

Приведенный выше код взят из известного проекта nginx, проверьте его, если интересно.

Ответы [ 5 ]

1 голос
/ 26 мая 2011

Это часто делается для переносимости кода и особенно актуально для встраиваемых систем.

Предположим, у вас есть целочисленные значения, которые ДОЛЖНЫ быть 32-битными. Может быть, им нужно сопоставить со структурой сети / диска, может быть, им нужно хранить значения этой величины или что-то в этом роде.

Теперь предположим, что вы разрабатываете свой код на компиляторе, где значение int равно 32 битам. Вы пишете ...

struct s {
 int a,b,c,d;
}

... и работает нормально. Но если вам нужно переключиться на компилятор, где int только 16-битный, а long 32, вам нужно изменить все эти объявления на

struct s {
 long a,b,c,d;
}

Хуже того, вы не можете просто искать / заменять, потому что некоторые из "целых" вам, вероятно, не важны по размеру. Итак, лучший подход к этому:

typedef long INT32; // change this typedef according to compiler

struct s {
 INT32 a,b,c,d;
}

Затем все, что вам нужно, это изменить typedefs.

1 голос
/ 26 мая 2011

Одной из целей typedef является переносимость.Например, разные компиляторы и платформы имеют разные размеры шрифтов, например sizeof (int) в x86, Linux, gcc - это не то же самое, что в процессорах Texas Instrument :) Но это все же int.

Итак,

typedef int INT32 

сохраняет один при переносе кода.

Другая цель typedef - объявлять типы, чтобы сделать более короткие объявления.

typedef sharted_ptr<MyClass> MyClassPtr;

И теперь вы можете использовать MyClassPtr в качестве типа вместо записи всей строки shared_ptr ...

И очень распространенное использование typedef со структурами:

typedef struct {
   int x;
   int y;
} Point;

или

struct point {
   int x;
   int y;
}

typedef struct point Point;

Оба typedefs позволяют избегать ввода ключевого слова struct каждый раз.

0 голосов
/ 26 мая 2011

Причиной может быть то, что они хотят изменить тип указателя при переносе кода.В другой системе могут быть разные режимы адресации («банковские» и т. Д.), И тогда им может понадобиться нестандартный синтаксис, например

typedef far intptr_t        ngx_int_t; 

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

0 голосов
/ 26 мая 2011

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

0 голосов
/ 26 мая 2011

Я знаю две причины:

  • Псевдоним, превращающий сложное объявление в нечто более простое
  • Переносимость, при другой архитектуре тип может быть по-разному просто, как очень простой пример: u32 , где в некоторых местах может быть определен как unsigned int , другой unsigned long type.
...