Next: Statements, Previous: Enumeration Types, Up: Top [Contents][Index]
You can define a data type keyword as an alias for any type, and then
use the alias syntactically like a built-in type keyword such as
int. You do this using typedef, so these aliases are
also called typedef names.
typedef is followed by text that looks just like a variable
declaration, but instead of declaring variables it defines data type
keywords.
Here’s how to define fooptr as a typedef alias for the type
struct foo *, then declare x and y as variables
with that type:
typedef struct foo *fooptr; fooptr x, y;
That declaration is equivalent to the following one:
struct foo *x, *y;
You can define a typedef alias for any type. For instance, this makes
frobcount an alias for type int:
typedef int frobcount;
This doesn’t define a new type distinct from int. Rather,
frobcount is another name for the type int. Once the
variable is declared, it makes no difference which name the
declaration used.
There is a syntactic difference, however, between frobcount and
int: A typedef name cannot be used with
signed, unsigned, long or short. It has
to specify the type all by itself. So you can’t write this:
unsigned frobcount f1; /* Error! */
But you can write this:
typedef unsigned int unsigned_frobcount; unsigned_frobcount f1;
In other words, a typedef name is not an alias for a keyword
such as int. It stands for a type, and that could be
the type int.
Typedef names are in the same namespace as functions and variables, so you can’t use the same name for a typedef and a function, or a typedef and a variable. When a typedef is declared inside a code block, it is in scope only in that block.
Warning: Avoid defining typedef names that end in ‘_t’, because many of these have standard meanings.
You can redefine a typedef name to the exact same type as its first definition, but you cannot redefine a typedef name to a different type, even if the two types are compatible. For example, this is valid:
typedef int frobcount; typedef int frotzcount; typedef frotzcount frobcount; typedef frobcount frotzcount;
because each typedef name is always defined with the same type
(int), but this is not valid:
enum foo {f1, f2, f3};
typedef enum foo frobcount;
typedef int frobcount;
Even though the type enum foo is compatible with int,
they are not the same type.
Next: Statements, Previous: Enumeration Types, Up: Top [Contents][Index]