typedef vs #define in C: Choosing the Right Approach

Rumman Ansari   Software Engineer   2024-07-05 05:01:14   7446  Share
Subject Syllabus DetailsSubject Details
☰ TContent
☰Fullscreen

Typedef is a keyword that is used to give a new symbolic name for the existing name in a C program. This is same like defining alias for the commands.

typedef : typedef is used to give data type a new name, for example

Program:

<span class="pln">
</span><span class="com">// C program to demonstrate typedef</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
 
</span><span class="com">// After this line BYTE can be used</span><span class="pln">
</span><span class="com">// in place of unsigned char</span><span class="pln">
</span><span class="kwd">typedef</span><span class="pln"> </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> BYTE</span><span class="pun">;</span><span class="pln">
 
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    BYTE b1</span><span class="pun">,</span><span class="pln"> b2</span><span class="pun">;</span><span class="pln">
    b1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">'c'</span><span class="pun">;</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"%c "</span><span class="pun">,</span><span class="pln"> b1</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>

Output:

<span class="pln">
c
</span>

#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 where as #define can be used to define alias for values as well, q., you can define 1 as ONE etc.

  • typedef interpretation is performed by the compiler whereas #definestatements are processed by the pre-processor.

The following example shows how to use #define in a program ?

Program:

<span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
 
</span><span class="com">#define</span><span class="pln"> TRUE  </span><span class="lit">1</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> FALSE </span><span class="lit">0</span><span class="pln">
 
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
   printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Value of TRUE : %d\n"</span><span class="pun">,</span><span class="pln"> TRUE</span><span class="pun">);</span><span class="pln">
   printf</span><span class="pun">(</span><span class="pln"> </span><span class="str">"Value of FALSE : %d\n"</span><span class="pun">,</span><span class="pln"> FALSE</span><span class="pun">);</span><span class="pln">

   </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>

Output:

When the above code is compiled and executed, it produces the following result ?

<span class="pln">
</span><span class="typ">Value</span><span class="pln"> </span><span class="kwd">of</span><span class="pln"> TRUE </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="typ">Value</span><span class="pln"> </span><span class="kwd">of</span><span class="pln"> FALSE </span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="typ">Press</span><span class="pln"> any key to </span><span class="kwd">continue</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span>

#define : is a C directive which is used to #define alias.

Another Program:

<span class="pln">
</span><span class="com">// C program to demonstrate #define</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
 
</span><span class="com">// After this line SI is replaced by</span><span class="pln">
</span><span class="com">// "SMILE"</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> SI </span><span class="str">"SMILE"</span><span class="pln">
 
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"%s "</span><span class="pun">,</span><span class="pln"> SI</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>

Output:

<span class="pln">
SMILE </span><span class="typ">Press</span><span class="pln"> any key to </span><span class="kwd">continue</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span>

typedef is different from #define among the following aspects

  • typedef is limited to giving symbolic names to types only, whereas #define can be used to define alias for values as well, e.g., you can define 1 as ONE, 3.14 as PI, etc.
  • typedef interpretation is performed by the compiler where #define statements are performed by preprocessor.
  • #define should not be terminated with a semicolon, but typedef should be terminated with a semicolon.
  • #define will just copy-paste the definition values at the point of use, while typedef is actual definition of a new type.
  • typedef follows the scope rule which means 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. In case of #define, when preprocessor encounters #define, it replaces all the occurrences, after that (No scope rule is followed).

Another Program:

<span class="pln">
</span><span class="com">// C program to demonstrate importance</span><span class="pln">
</span><span class="com">// of typedef over #define for data types</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="kwd">typedef</span><span class="pln"> </span><span class="kwd">char</span><span class="pun">*</span><span class="pln"> ptr</span><span class="pun">;</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> PTR </span><span class="kwd">char</span><span class="pun">*</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    ptr a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">;</span><span class="pln">
    PTR x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> z</span><span class="pun">;</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"sizeof a:%u\n"</span><span class="pln"> </span><span class="pun">,</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"sizeof b:%u\n"</span><span class="pln"> </span><span class="pun">,</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"sizeof c:%u\n"</span><span class="pln"> </span><span class="pun">,</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">c</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"sizeof x:%u\n"</span><span class="pln"> </span><span class="pun">,</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"sizeof y:%u\n"</span><span class="pln"> </span><span class="pun">,</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"sizeof z:%u\n"</span><span class="pln"> </span><span class="pun">,</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">z</span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span>

Output:

<span class="pln">
</span><span class="kwd">sizeof</span><span class="pln"> a</span><span class="pun">:</span><span class="lit">8</span><span class="pln">
</span><span class="kwd">sizeof</span><span class="pln"> b</span><span class="pun">:</span><span class="lit">8</span><span class="pln">
</span><span class="kwd">sizeof</span><span class="pln"> c</span><span class="pun">:</span><span class="lit">8</span><span class="pln">
</span><span class="kwd">sizeof</span><span class="pln"> x</span><span class="pun">:</span><span class="lit">8</span><span class="pln">
</span><span class="kwd">sizeof</span><span class="pln"> y</span><span class="pun">:</span><span class="lit">1</span><span class="pln">
</span><span class="kwd">sizeof</span><span class="pln"> z</span><span class="pun">:</span><span class="lit">1</span><span class="pln">
</span><span class="typ">Press</span><span class="pln"> any key to </span><span class="kwd">continue</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span>

From the output of the above program size of “a” which is a pointer is 8 (on a machine where pointers are stored using 8 bytes). In the above program, when the comes to

typedef char* ptr;
ptr a, b, c;

the second line effectively becomes

char* a, b, c;

This declares a, b, c as char*.

In contrast, define is like this:

#define PTR char*
PTR x, y, z;

The second line efficiently becomes

char* x,y,z;

This makes x and y, z different as x is pointer-to-a char where as y,z are char variables. When we declare macros with pointers while defining if while defining if declare more than one identifier then the actual definition is given to the first identifier and for the rest non-pointer definition is given. In the above case x will be declared as char*, so its size is the size of pointer whereas y and z will be declared as char so, their size will be 1 byte.


No Questions Data Available.
No Program Data.

Stay Ahead of the Curve! Check out these trending topics and sharpen your skills.