Это соглашение о кодировании? - PullRequest
4 голосов
/ 13 июля 2011

Я занимаюсь улучшением функций кода, и вот что я видел в существующем коде. Если объявлен enum или struct, позже всегда будет typedef:

enum _Mode {
   MODE1 = 0,
   MODE2,
   MODE3
};
typedef enum _Mode Mode;

Аналогично структуре:

struct _Slot {
     void * mem1;
     int mem2;
};
typedef struct _Slot Slot;

Разве нельзя объявить структуры напрямую, как в enum? Почему существует typedef для чего-то столь же незначительного, как подчеркивание? Это соглашение о кодировании?

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

Пожалуйста, помогите. П.С .: В качестве дополнительной информации исходный код написан на C, а Linux является платформой.

Ответы [ 4 ]

9 голосов
/ 13 июля 2011

В C, чтобы объявить varaible со структурным типом, вы должны будете использовать следующее:

struct _Slot a;

typedef позволяет вам сделать это более аккуратным, создавая псевдоним. И разрешить объявление переменной следующим образом:

Slot a;
4 голосов
/ 13 июля 2011

В C есть отдельные "пространства имен" для struct и typedef . Таким образом, без typedef вы бы получили доступ к Slot как struct _Slot, что является более типичным. Для сравнения:

struct Slot { ... };

struct Slot s;
struct Slot create_s() { ... }
void use_s(struct Slot s) { ... }

против

typedef struct _Slot { ... } Slot;

Slot s;
Slot create_s() { ... }
void use_s(Slot s) { ... }

Также см. http://en.wikipedia.org/wiki/Struct_(C_programming_language)#typedef для получения подробной информации, например, о возможном конфликте пространства имен.

2 голосов
/ 13 июля 2011

Если структура является следующей:

struct _Slot {
     void * mem1;
     int mem2;
};

вам нужно следующее для объявления переменной:

struct _Slot s;

Обратите внимание на дополнительные struct перед _Slot. Кажется более естественным объявить переменную типа Slot s, не так ли?

Если вы хотите избавиться от лишних struct, вам нужно typedef:

typedef struct _Slot Slot;
Slot s;
1 голос
/ 13 июля 2011

Это своего рода метод обфускации кода, который имеет смысл только в небольшом количестве случаев.

Люди говорят, что более естественно не писать "struct" и другие субъективные вещи.

Но объективно,по крайней мере, один а) не может форвард объявить такую ​​структуру с определенными типами, б) должен перепрыгнуть через один обруч при использовании ctags.

...