C - Typedef
typedef is a keyword in C language which is used to assign alternative name to existing datatype. It does not introduce a distinct type, it only establishes a synonym for an existing datatype. The syntax for typedef declaration is given below:
Syntax
typedef <existing_name> <alias_name>
Where, existing_name is the name of an already existing data type and alias_name is the alternative name given to it. For example, To give a name MyInt to unsigned int, the following declaration can be used:
typedef unsigned int MyInt;
Example:
In the example below, unsigned int is typedef declared as MyInt, which is further used in a for loop to print it.
#include <stdio.h> int main (){ typedef unsigned int MyInt; for(MyInt i = 1; i <= 5; i++){ printf("%u\n", i); } return 0; }
The output of the above code will be:
1 2 3 4 5
Using typedef with structures
The typedef declaration can be used to give a name to user-defined data types as well. For example, typedef can be used with structures to define a new data type and then use that data type to define structure variables.
Example:
In the example below, a variable emp of type struct Employee is created, which is further used to store data of an Employee.
#include <stdio.h> #include <string.h> typedef struct Employees { char name[50]; int age; char city[50]; int salary; } Employee; int main (){ Employee emp; strcpy(emp.name, "John"); emp.age = 25; strcpy(emp.city, "London"); emp.salary = 75000; printf("Employee name: %s\n", emp.name); printf("Employee age: %d\n", emp.age); printf("Employee city: %s\n", emp.city); printf("Employee salary: %d\n", emp.salary); return 0; }
The output of the above code will be:
Employee name: John Employee age: 25 Employee city: London Employee salary: 75000
Using typedef with pointers
Similarly, an another name or alias name can be provided to pointer variables by using typedef declaration.
Example:
In the example below, integer pointer type is given an another name intptr.
#include <stdio.h> int main (){ //typedef declaration typedef int* intptr; int MyVar = 10; //using intptr instead of int* intptr p1; p1 = &MyVar; printf("Address stored in p1 variable: %p\n",p1); printf("Value stored in *p1: %i",*p1); return 0; }
The output of the above code will be:
Address stored in p1 variable: 0x7ffe2c4a86cc Value stored in *p1: 10
typedef vs #define
#define is a C-directive which is also used to define the aliases for various data types similar to typedef, but with the following differences:
- typedef is limited to giving symbolic names to types only, whereas #define can be used to define an alias for values as well, for example: 3.14 can be defined as PI.
- typedef interpretation is performed by the compiler where #define statements are performed by pre-processor.
- #define is not terminated with a semicolon, but typedef is terminated with a semicolon.
- typedef follows the scope rule i.e., if a new type is defined in a scope (inside a function or block), then the new type name will only be visible within the scope. Whereas in case of #define, when the pre-processor encounters #define, it replaces all the occurrences.
Example:
The example below shows the usage of #define C-directive.
#include <stdio.h> #define PI 3.14 #define MyInt int #define False 0 int main (){ MyInt x = 10; printf("x = %i\n", x); printf("PI = %f\n", PI); printf("False = %i\n", False); return 0; }
The output of the above code will be:
x = 10 PI = 3.140000 False = 0