Difference between #define and typedef
The #define is a C-directive which is also used to define the aliases for various data types similar to typedef but with following differences:
- The typedef is limited to giving symbolic names to types only where as #define can be used to define alias for values as well, like you can define 1 as ONE etc.
- The typedef interpretation is performed by the compiler where as #define statements are processed by the pre-processor.
- #define should not be terminated with semicolon, but typedef should be terminated with semicolon.
typedef char* PTR_t; #define PTR_d char*
- #define will just copy-paste the definition values at the point of use, while typedef is actual definition of a new type
typedef char* PTR_t; #define PTR_d char* PTR_t p1,p2; // In typedef usage, Both p1 and p2 are become char* PTR_d ptr1,ptr2; // In macro usage, only ptr1 becomes of type char* while ptr2 is char only
- typedef follows the scope rule which mean if a new type is defined in a scope(inside a function), then the new type name will only be visible till the scope is there.
But in preprocessor case, when preprocessor encounters a #define, then it will replace all the occurrences, after that (No scope rule is followed). See below example:
#include <stdio.h> void print() { #define ONE 1 typedef int integer; printf("%d",ONE); } int main() { printf("%d",ONE); // Print 1 successfully integer a; // Gives compiler error return 0; }
- There are certain types of definitions which you can only define using typedef only and not #define like below
typedef unsigned int U_INT32; // We cant define this with #define, because it contain more that one word in definition( unsigned and int here) .
- There is some benefit of typedef when we define structure with typedef like this
typedef struct { int x; char y; float z; }MyStruct; //Now define new objects MyStruct A; // You dont need to use struct repeatedly when you define structure again.
Problems on typedef and #define
This problems will clear some doubts and give you practical idea
1. What is the output of this C code?
#include <stdio.h> typedef struct student { char *a; }stu; void main() { struct student s; s.a = "hey"; printf("%s", s.a); }
a) Compile time error
b) Varies
c) he
d) hey
2. What is the output of this C code?
#include <stdio.h> typedef struct p { int x, y; }; int main() { p k1 = {1, 2}; printf("%d\n", k1.x); return 0; }
a) Compile time error
b) 1
c) 0
d) Depends on the standard
3. The correct syntax to use typedef for struct is.
a) typedef struct temp { int a; }TEMP; b) typedef struct { int a; }TEMP; c) struct temp { int a; }; typedef struct temp TEMP; d) All of the mentioned
4. typedef int (*PFI)(char *, char *)creates
a) type PFI, for pointer to function (of two char * arguments) returning int
b) Error
c) type PFI, function (of two char * arguments) returning int
d) type PFI, for pointer
5. For the following expression to work, which option should be selected.
string p = “HELLO”;
a) typedef char [] string;
b) typedef char *string;
c) Both (a) and (b)
d) Such expression cannot be generated in C
6. What is the output of this C code?
#include<stdio.h> typedef char* charPtr_t; #define charPtr_d char* int main() { charPtr_t a,b; charPtr_d x,y; printf("%d,%d,%d,%d",sizeof(a),sizeof(b),sizeof(x),sizeof(y)); return 0; }
a) Compiler error
b) 8,8,8,8
c) 1,1,1,1
d) 8,8,8,1
Answers: (1: d) , (2: a) , (3: d) ,(4: a ) , (5: b), (6: d)