Смущает #define и typedef - PullRequest
       24

Смущает #define и typedef

2 голосов
/ 22 марта 2011
#define T Stack_T
typedef struct T *T;

Тогда что означает T в struct T, то, что определено #define или typedef?

Ответы [ 4 ]

8 голосов
/ 22 марта 2011
Директивы

#define заменяются на ранних этапах процесса компиляции (фаза перевода 4, компиляция фактически не происходит до фазы 7, эти фазы и то, что происходит во время них, подробно описаны в стандарте, раздел 5.1.1.2).

То, что #define просто изменит T токены предварительной обработки на Stack_T.

Эффект этого на typedef будет превращать его в:

typedef struct Stack_T *Stack_T;

После этого Stack_T определяется как тип, указатель на другой тип struct Stack_T.Stack_T и struct Stack_T - это две разные вещи.

3 голосов
/ 22 марта 2011

Препроцессор выполняет только текстовые подстановки, поэтому код будет выглядеть как

typedef struct Stack_T *Stack_T;

Таким образом, каждый T в вашем коде сначала заменяется на Stack_T, и после этого ваш компилятор включается, видит typedef и использует struct Stack_T*.

Было бы полезно знать, что struct Type и Type одинаковы только в C ++, но не в C.

0 голосов
/ 22 марта 2011

T представляет Stack_T, поэтому вы можете прочитать typedef как:

typdef struct Stack_T *Stack_T;

, поэтому каждый T в вашем коде заменяется на Stack_T во время компиляции компилятора.

0 голосов
/ 22 марта 2011

Так как #define обрабатывается в предварительной компиляции и struct в компиляции, после предварительной компиляции вы получите typedef struct T *T; выглядит так: typedef struct Stack_T *Stack_T;

...