When Use Preprocessor Directives?

Preprocessor in Hindi: कई बार हमें ऐसी जरूरत होती है जिसमें हम चाहते हैं कि हमारा Source Program Compiler पर Compile होने के लिए Processor पर जाने से पहले कुछ काम करे। इस प्रकार के कामों को परिभाषित करने के लिए हम Preprocessor Directives का प्रयोग करते हैं।

Preprocessor Directives की शुरूआत हमेंशा # से होती है और इन्हें हमेंशा Header Files को Include करने वाले Statement के Just नीचे लिखा जाता है। Preprocessor Directives को समझने के लिए हम एक Program देखते हैं, जिसमें हम Output में “Hello World” Print करना चाहते हैं। ये Program निम्नानुसार हैः

Program:

#include <stdio.h>
#include <conio.h>

#define START  main() {
#define PRINT  printf(“Hello World”);
#define PAUSE  getch();
#define END    }

START    /*  Start the program. */
PRINT    /*  Display message on the screen.*/
PAUSE    /*  Pause the screen to display output. */
END      /*  Terminate the program. */

Output:
Hello World

जब भी हम इस Program को Compile करते हैं, इस Program में Define किए गए सभी Preprocessor Directives Program के Processor पर Compile होने के लिए जाने से पहले Expand होकर मूल Codes में Convert हो जाते हैं। जब सभी Directives Expand हो जाते हैं, तब ये Program निम्नानुसार Normal Form में आ जाता हैः

#include <stdio.h>
#include <conio.h>
main() {                   /* START */
printf("Hello World");     /* PRINT */
getch();                   /* PAUSE */
}                          /* END   */

Compiler अब इस Normal Form में Converted Program को Processor पर Compile होने के लिए भेजता है। चूंकि #define के साथ Use किए जाने वाले Directives Program के Processor पर Compile होने के लिए जाने से पहले Expand होते हैं, इसलिए इन Directives को Preprocessor Directives कहा जाता है। विभिन्न प्रकार के Preprocessor Directives के बारे में हमने “C Programming Language in Hindi” नाम की eBook मे विस्तार से चर्चा की है।

Preprocessor Directives का प्रयोग Header Files को Develop करते समय ही सबसे ज्यादा किया जाता है। C Language की Library में विभिन्न प्रकार के तकनीकी मानों को सरल रूप में Represent करने के लिए उन्हें Preprocessor Directives का प्रयोग करके एक सरल नाम दे दिया जाता है, ताकि इन मानों को सरलता से याद रखा जा सके व Use किया जा सके।

Preprocessor Directives का प्रयोग करके हम विभिन्न प्रकार के बडे-बडे तकनीकी नामों व मानों को सरल व छोटे Identifier के रूप में परिभाषित किया जा सकता है। एक बार किसी मान का कोई नाम दे देने के बाद हम उस मान के उसके नाम से Refer कर सकते हैं। उदाहरण के लिए मानलो कि हमें किसी Program में बार-बार PI के मान 3.142857142857142 की जरूरत पडती है। अब इतने बडे मान को बार-बार विभिन्न Statements में बिना गलती के लिखना, नामुमकिन है। किसी ना किसी Statement में इसको Type करने में Mistake हो ही जाएगी।

इस स्थिति में हम एक Preprocessor Directive का प्रयोग करके इस मान को एक नाम प्रदान कर सकते हैं। इस मान को एक नाम प्रदान कर देने के बाद हमें जिस किसी भी स्थान पर Calculation के लिए इस मान की जरूरत हो, हम उस नाम को Use कर लेते हैं। जब Program को Compile करते हैं, तब Program Compile होने से पहले उन सभी स्थानों पर जहां पर Preprocessor का प्रयोग किया गया है, Preprocessor को उसके मान से Replace कर देता है। इस तरह से Program में Typing की वजह से होने वाली गलतियों से बचा जा सकता है। इस प्रक्रिया को निम्न Program में Implement किया गया है।

Program:

#include <stdio.h>
#include <conio.h>

#define PI  3.142857142857142

main()
{
 printf("Value of PI is = %.15e", PI);
 getch();
}

जब इस Program को Run किया जाता है, तब Output में %2.15e Control String के स्थान पर मान 3.142857142857142 को Represent करने वाले Identifier PI के स्थान पर ये मान Expand हो जाता है और Screen पर घातांक रूप में Display हो जाता है।

चूंकि Float प्रकार का Control String दसमलव के बाद केवल 6 अंकों तक की संख्‍या को ही Display कर सकता है, इसलिए हमने इस Program के printf() Function में %.15e Control String का प्रयोग किया है। ये Control String, Compiler को ये Instruction देता है, कि Screen पर Display किए जाने वाले मान में दसमलव के बाद कुल 15 Digits Display होने चाहिएं। ये Program जब Compile किया जाता है, तब Compile होने से पहले निम्नानुसार Form में Convert हो जाता हैः

Program:

#include <stdio.h>
#include <conio.h>

main()
{
 printf("Value of PI is = %.15e", 3.142857142857142);
 getch();
}

जब हम अपनी जरूरत के आधार पर विभिन्न प्रकार के Identifier Declare करते हैं, तब किस प्रकार का Identifier Memory में Minimum व Maximum कितने मान तक की संख्‍या को Hold कर सकता है, इस बात की जानकारी C Language के साथ मिलने वाली “limits.h” नाम की Header File में दी गई है। यदि हम चाहें तो इस Header File को जो कि C Installation Folder के Include नाम के Folder में होती है, Open करके विभिन्न Data Types द्वारा Store की जा सकने वाली Minimum व Maximum Range का पता लगा सकते हैं।

इस Header File में विभिन्न Data Type द्वारा प्रदान की जाने वाली Minimal व Maximum Range को कुछ Preprocessor Directives के रूप में Define किया गया है। इसलिए यदि हम Header File को Open करके ना देखना चाहें, तो निम्नानुसार एक Program बना कर भी हम विभिन्न Data Types द्वारा प्रदान की जाने वाली Minimum व Maximum Range का पता लगा सकते हैं।

चूंकि इन विभिन्न प्रकार के Directives को “limits.h” नाम की Header File में Define किया गया है, इसलिए इन Directives को Access करने के लिए हमें “limits.h” नाम की Header File को अपने Program में Include करना जरूरी होता है।

Program:

// File: DataTypeLimit.c

#include <stdio.h>
#include <conio.h>
#include <float.h>
#include <limits.h>

#define _ printf("n Minimum
#define __ printf("n Maximum

void main(){
_ short|short int|signed short|signed short int : %d ",SHRT_MIN );
__ short|short int|signed short|signed short int : %d ",SHRT_MAX );
_ unsigned short|unsigned short int : %u", 0 );
__ unsigned short|unsigned short int : %u ",USHRT_MAX );
_ int|signed int: %d ",INT_MIN );
__ int|signed int: %d ", INT_MAX );
_ unsigned int: %u ", 0 );
__ unsigned int: %u ", UINT_MAX );
_ long|long int|signed long|signed long int : %ld ",LONG_MIN );
__ long|long int|signed long|signed long int: %ld ", LONG_MAX );
_ unsigned long|unsigned long int: %lu ", 0 );
__ unsigned long|unsigned long int: %lu", ULONG_MAX );
_ float: %e", FLT_MIN);
__ float: %e", FLT_MAX);
_ double: %e", DBL_MIN);
__ double: %e", DBL_MAX);
_ long double: %Le", LDBL_MIN);
__ long double: %Le",LDBL_MAX);
}

ये Program देखने में बहुत अजीब लग सकता है, लेकिन इस Program में हमने Underscore व Double Underscore Symbol से printf() Function के कुछ Part को Directive के रूप में परिभाषित कर लिया है।

जब इस Program को Compile करते हैं, तब Program Compile होने से पहले Underscore ( _ ) Symbol के स्थान पर “printf(“\n Minimum” String को व Double Underscore Symbol ( __ ) के स्थान पर “printf(“\n Maximum” String Replace कर देता है। Preprocess होने के बाद जब Program Compile होकर Run होता है, तब हमें इस Program का Output निम्नानुसार प्राप्त होता हैः

Output:

Minimum short|short int|signed short|signed short int: -32768
 Maximum short|short int|signed short|signed short int: 32767
 Minimum unsigned short|unsigned short int : 0
 Maximum unsigned short|unsigned short int : 65535
 Minimum int|signed int : -2147483648
 Maximum int|signed int : 2147483647
 Minimum unsigned int : 0
 Maximum unsigned int : 4294967295
 Minimum long|long int|signed long|signed long int : -2147483648
 Maximum long|long int|signed long|signed long int : 2147483647
 Minimum unsigned long|unsigned long int: 0
 Maximum unsigned long|unsigned long int : 4294967295
 Minimum float : 1.175494e-38
 Maximum float : 3.402823e+38
 Minimum double : 2.225074e-308
 Maximum double : 1.797693e+308
 Minimum long double : 3.362103e-4932
 Maximum long double : 1.189731e+4932

limits.h नाम की Header File में विभिन्न प्रकार के Integers से सम्बंधित Range की जानकारी होती है, उसी तरह से Float से सम्बंधित विभिन्न प्रकार के Range की जानकारी के लिए हम “float.h” नाम की Header File को Open करके देख सकते हैं। इसीलिए हमने हमारे Program में Float व Double से सम्बंधित Range की जानकारी के लिए “float.h” नाम की Header File को भी अपने Program में Include किया है।

यदि हम ये जानना चाहें कि विभिन्न प्रकार के Data Type के Identifiers Memory में कितने Bytes की Space Reserve करते हैं, तो इस बात का पता लगाने के लिए हम sizeof() Operator का प्रयोग कर सकते हैं। ये Operator Argument के रूप में उस Identifier या Data Type को लेता है, जिसकी Size को हम जानना चाहते हैं और हमें उस Data Type या Identifier की Size Return करता है। यानी इस Operator के Bracket के बीच में हम जिस Identifier या Data Type को लिख देते हैं, हमें उसी Data Type की Size का पता चल जाता है।

सामान्यतया Integer Data Type के अलावा सभी Data Types सभी प्रकार के Computers में समान Memory Occupy करते हैं, जबकि Integer, Memory में Compiler के Register की Size के बराबर Space Reserve करता है। यदि हम 16-Bit Compiler में 16-Bit Processor पर Program Develop करते या Run करते हैं, तो Integer 16-Bit System में 2-Bytes का होता है जबकि 32-Bit System में Integer की Size 4-Bytes होती है। हम जिस Compiler को Use कर रहे हैं, उस Compiler द्वारा विभिन्न प्रकार के Basic Data Type द्वारा Occupy की जा रही Memory का पता हम निम्न Program द्वारा लगा सकते हैं:

Program:

// File: DataTypeSize.c

#include <stdio.h>
#include <conio.h>

void main()
{
printf("char:%d Bytesn", sizeof(char));
printf("short:%d Bytesn", sizeof(short));
printf("int:%d Bytesn", sizeof(int));
printf("long:%d Bytesnn", sizeof(long));

printf("signed char:%d Bytesn",sizeof(signed char));
printf("signed short:%d Bytesn",sizeof(signed short));
printf("signed int:%d Bytesn",sizeof(signed int));
printf("signed long:%d Bytesnn",sizeof(signed long));

printf("unsigned char:%d Bytesn",sizeof(unsigned char));
printf("unsigned short:%d Bytesn",sizeof(unsigned short));
printf("unsigned int:%d Bytesn",sizeof(unsigned int));
printf("unsigned long:%d Bytesnn",sizeof(unsigned long));

printf("float:%d Bytesn",sizeof(float));
printf("double:%d Bytesn",sizeof(double));
printf("long double:%d Bytesn",sizeof(long double));

getch();
}

Preprocessor Directives का प्रयोग करके ही हम Selective Compilation करने की सुविधा प्राप्‍त करते हैं। इसलिए जब हम Header Files Create करना चाहते हैं, तब हमें Preprocessor Directives को उसकी पूरी क्षमता के साथ Use करने की जरूरत पडती है। इसलिए Preprocessor Directives के बारे में विभिन्‍न प्रकार के सरल Example Programs का प्रयोग करते हुए बेहतर तरीके से समझने के लिए आप हमारी C Programming Language in Hindi पढ सकते हैं, जिसमें Preprocessor Directives  के Concept को विभिन्‍न प्रकार के Example Programs के माध्‍यम से काफी Detail से समझाया गया है। (Preprocessor in Hindi)

C Programming Language in Hindi - BccFalna.com ये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook  C Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C Programming Language in Hindi | Page: 477 + 265 | Format: PDF

BUY NOW GET DEMO REVIEWS