13.2 Type References
Another way to refer to the type of an expression is with the
typeof
keyword. This is a non-standard extension to the language. Using
this feature reduces your code portability.
The syntax for using this keyword looks like sizeof
, but
the construct acts semantically like a type name defined with typedef
.
There are two ways of writing the argument to typeof
:
with an expression or with a type. Here is an example with an expression:
typeof (x[0](1))
This assumes that x
is an array of functions; the type
described is that of the values of the functions.
Here is an example with a typename
as the argument:
typeof (int *)
Here the type described is a pointer to int
.
If you are writing a header file that must work when included in ANSI C
programs, write _ _typeof_ _
instead of typeof
.
A typeof
construct can be used anywhere a
typedef
name could be used. For example, you can use it in a
declaration, in a cast, or inside of sizeof
or
typeof
.
- This declares
y
with the type of whatx
points to:typeof (*x) y;
- This declares
y
as an array of such values:typeof (*x) y[4];
- This declares
y
as an array of pointers to characters:typeof (typeof (char *)[4]) y;
It is equivalent to the following traditional C declaration:
char *y[4];
To see the meaning of the declaration using typeof
, and
why it might be a useful way to write, let’s rewrite it with these macros:
#define pointer(T) typeof(T *)
#define array(T, N) typeof(T [N])
Now the declaration can be rewritten this way:
array (pointer (char), 4) y;
Thus, array (pointer (char), 4)
is the type of arrays of
four pointers to char
.