Другое преимущество использования такого struct
состоит в том, что обеспечивает безопасность типов везде, где используется такой struct
;особенно если у вас есть два типа, состоящие из массивов одного размера, используемых для разных целей, эти типы помогут вам избежать случайного использования массива ненадлежащим образом.
Если вы не переносите массив в struct
, вывсе еще может объявить typedef
для этого: у этого есть некоторые преимущества struct
- • тип объявляется один раз, • размер автоматически корректен, • цель кода становится более ясной, • и код более удобен в обслуживании- но вы теряете ◦ строгую безопасность типов, ability возможность копировать и возвращать значения типа и ◦ возможность добавлять элементы позже, не нарушая остальную часть вашего кода.Два typedef
s для голых массивов данного типа дают разные типы, только если они имеют разные размеры.Более того, если вы используете typedef
без *
в аргументе функции, это эквивалентно char *
, что резко снижает безопасность типов.
В итоге :
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113