Macro Substitution Directive

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 DOWNLOAD READ ONLINE

Macro Substitution Directive: ये एक ऐसा तरीका होता है जिसमें किसी Program का कोई Identifier किसी Predefined String से Replace होता है। Processor ये काम किसी #define Statement के Under में करता है। इस तरह के Statements को Macro Definition कहा जाता है। जैसे:

        #define START main(){

जब हम हमारे Program में इस प्रकार से किसी Macro को Define करते हैं तो Program में जहां भी Macro का नाम होता है Program Compile होने से पहले वहां पर Define की गई String Replace हो जाती है। इसे समझने के लिए निम्न Program देखिए-

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

   #define START main()
   {
	#define PI 	  3.14

	START
	float Area, radius;
	printf("Enter Radius");
	scanf("%f", &radius);

	Area = PI * radius * radius;

	printf("Area of Radius is %f ", Area);
	getch();
   }

जब इस Program को Compile किया जाता है तब Program Compile होने से पहले सारे Macro Statements Expand होते हैं। यानी ये Program Compile होने से पहले निम्नानुसार Format में Convert होता है

// Program
//Expanded File : 
#include <stdio.h>
#include <conio.h>

#define START main(){
#define PI 	  3.14

main()
{
	float Area, radius;
	printf("Enter Radius");
	scanf("%f", &radius);

	Area = 3.14 * radius * radius;

	printf("Area of Radius is %f ", Area);
	getch();
}

Source Code के Expand होने पर START के स्थान पर main(){ व PI के स्थान पर 3.14 मान आ जाता है। मान आने के बाद Program Compile होता है। Macro Definition के बाद जो मान लिखा जाता है वह वास्तव में एक String होता है। यानी इस Program में PI का जो मान 3.14 लिखा गया है वह float Value नहीं है बल्कि एक String है। Macro Substitution के कई तरीके होते हैं:

Simple Macro Substitution

सामान्‍यतया इस तरह के Macro किसी Constant को Define करने के लिए लिखे जाते हैं। जैसे:

#define		COUNT		200
#define		TRUE		1
#define 	LAMBDA	        2.1
#define 	NAME		"Raghva"
#define		SIZE		sizeof(float)*6
#define		AREA		(3.1415926 * 12)

सामान्‍यतया सभी Macros को Capital Letters में लिखा जाता है ताकि हम जब भी किसी Macro को अपने Program में Use करें तो हमें पता रहे कि हम किसी Macro को Use कर रहे हैं। सामान्‍यतया सभी Mathematical Expressions को कोष्‍ठक में लिखना चाहिए।

कई बार हम Macro Define करते समय जो String लिखते हैं, वह String काफी लम्बी हो जाती है। इस स्थिति में यदि हम चाहें कि String को अगली स्पदम में लिख दें] तो हम ये काम Back Slash का प्रयोग करके कर सकते हैं। जैसे

        #define LONG_STRING         “This string is very long to fit in one \

                                                                line; so write it in next line.”

Macros with Arguments

Macros का प्रयोग करके हम और अधिक जटिल Statements लिख सकते हैं। जैसे

        #define        CUBE(x)       (x * x * x)

यहां CUBE(x) में लिखा गया Argument एक Formal Argument है। जब इस Macro को Use किया जाता है तब हम जो Argument CUBE Macro के कोष्‍ठक में देते हैं वह Expand होकर x * x * x हो जाता है। जैसे

        int lside = 20, total;

        total = CUBE(lside);

जब हम इस Statement को लिखते हैं तो Program Compile होने से पहले निम्नानुसार Expand होता है और total में 8000 Return करता है-

        total = ( lside * lside * lside );

हम यदि चाहें तो CUBE Macro को निम्नानुसार भी Use कर सकते हैं-

        int total, lside = 10, rside = 5;

        total = CUBE(lside + rside)

ये Statement निम्नानुसार Expand होगा-

        total = (lside + rside * lside + rside * lside + rside);

हम देख सकते हैं कि ये Expanding सही Result Generate नहीं करेगा क्योंकि rside का lside से पहले गुणा होगा जबकि हम चाहते हैं कि पहले lside व rside का जोड हो। इस स्थिति में हमें निम्नानुसार CUBE Macro को Modify करना होगा%

        #define        CUBE(x)       ( (x) * (x) * (x) )

अब यदि हम इस Macro को अपने Program में Use करें तो ये निम्नानुसार Expand होगा%

        total = (( lside+rside ) * ( lside+rside) * ( lside+rside ));

अब इस Macro से जो Result प्राप्त होगा वह सही होगा। हम निम्नानुसार कुछ अन्‍य Macro Define कर सकते हैं जो कि हमारे लिए उपयोगी होते हैं:

        #define        MAX(A,B)    (((a) > (b)) ? (a) : (b))

        #define        MIN(A,B)     (((a) < (b)) ? (a) : (b))

        #define        ABS(x)  (((x) > 0 ) ? (x) : (-(x)))

Nesting of Macros

अन्‍य Statements की तरह हम Macros की भी Nesting कर सकते हैं। जैसे:

Code:

        #define                X                                     10

        #define                PI                                    3.1415

        #define                Y                                      X+10

        #define                SQUARE(z)                  ((z) * (z))

        #define                CUBE(x)                        (SQUARE(x) * (z))

एक Macro को किसी दूसरे Macro में Parameter के रूप में भी Use किया जा सकता है। जैसे ऊपर के Code में हमने X व Y को एक Macro बनाया है। इन्हे हम निम्नानुसार किसी अन्‍य Macro में Argument के रूप में भी Pass कर सकते हैं-

        #define        MAX(X,Y)     ( ((X) > (Y)) ? (X) : (Y) )

इसी Macro को हम निम्नानुसार Nested भी कर सकते हैं:

        int Maximum ;

        Maximum = MAX(x,(MAX(y, z))

ये Nested Macro तीन संख्‍याओं में से बडी संख्‍या Return करेगा। एक बात हमेंशा ध्‍यान रखें कि Macro Template व उसके Argument List के बीच किसी तरह का Space नहीं होना चाहिए। जैसे:

        #define        MAX  (X,Y)   (((X) > (Y)) ? (X) : (Y))

ये Macro काम नहीं करेगा। क्योंकि MAX व उसके Arguments के बीच Space दिया गया है।

Un-defining a Macro

किसी Define किए गए Macro को Undefined करने के लिए हमें #undef Directive का प्रयोग करना होता है। इस Directive को हम निम्नानुसार Use कर सकते हैं-

        #undef         CUBE(x)

#undef MAX(x, y)

हम किसी भी Macro को Source File में कहीं भी Undefined कर सकते हैं। यदि हम किसी Macro को Program में कहीं पर Undefined कर देते है, तो वह Macro वहीं पर Damage हो जाता है। जिस Statement पर किसी Macro को Undefined किया जाता है, यदि उस Statement से आगे कहीं पर भी उस Macro को Use किया गया है, तो Compiler उस Macro को प्राप्त नहीं कर पाता है, क्योंकि हमने उस Macro को Undefined कर दिया होता है।

__LINE__ and __FILE__ Predefined Identifiers of Compiler

ये दोनों Identifiers Compiler में पहले से ही Defined किए गए है। __LINE__ Identifier में Currently Compile हो रही Line का Number होता है और __FILE__ Identifier में Currently Compiler हो रही File का नाम होता है। इसे हम निम्न Program द्वारा समझ सकते हैं:

// Program
// File : Macro.c
#include <stdio.h>
#include <conio.h>

#define MAX 100

void main(void)
{
	#if MAX > 99 
		printf("Name of the Program File is %s", __FILE__ ); 
		printf("\n");
		printf("The Line being Compiled is %d", __LINE__);
	#else
		#error You have defined the MAX Macro Less than 100"
	#endif

	getch();
}

// Output
    Name of the Program File is Macro.c
    The Line being Compiled is 13

यदि हम चाहें, तो इन दोनों Compiler Identifiers के मान Change कर सकते हैं। यानी हम चाहें तो __LINE__ के Number की शुरूआत 100 Number से भी करवा सकते हैं और __FILE__ Identifier में किसी दूसरी File का नाम भी प्रदान कर सकते हैं। इसे समझने के लिए निम्न Program देखते हैं:

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

   #line 100 "inline.cpp"
   #define MAX 100

   void main(void)
   {
   	#if MAX > 99
		printf("Name of the Program File is %s", __FILE__ );
		printf("\n");
		printf("The Line being Compiled is %d", __LINE__);
	#else
		#error You have defined the MAX Macro Less than 100"
	#endif

   getch();
}

#line Macro #include Macro की तरह काम करता है। इसके आगे जिस File का नाम दिया जाता है, Program उस File को भी Expand करता है और हमें Output में ये बताता है कि जो Line हमने इस Program मे Print की है, वह Line Originally inline.cpp File से आई है। सामान्‍यतया इस Directive का प्रयोग उन Utility Programs में किया जाता है, जो C के Code को Output के रूप में Produce करना चाहते हैं।

Built – In Predefined Macros

  • __LINE__
  • __FILE__
  • __DATE__
  • __TIME__
  • __STDC__
  • __cplusplus__

इन में से दो Predefined Macros के बारे में हमने अभी बताया है। शेष Macros के कामों को भी हम निम्न Program File द्वारा समझ सकते हैं:

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

   #define __STDC__
   #define MAX 100

   void main(void)
   {
      #if MAX > 99
	printf("\nName of the Program File is  : %s", __FILE__);
	printf("\nThe Line being Compiled is   : %d", __LINE__);
	printf("\nThe Compilation Date of File : %s", __DATE__);
	printf("\nThe Compilation time of File : %s", __TIME__);

      #else
	#error You have defined the MAX Macro Less than 100"
      #endif

      getch();
}

यदि इस File को .c Extension से Save किया जाए, तो File Compile होने से पहले निम्नानुसार एक Error Message आता है और File Compile नहीं होती है।

        Error:  Macro.c(6,22):Error directive: File should be of .cpp Extension

ये Error इसलिए आता है क्योंकि हमने File को .C Extension से Save किया है। यदि हम File को .CPP Extension से Save कर दें] तो File ठीक प्रकार से Run होती है। चूंकि जब हम Header File बनाते हैं, तब कुछ Statements ऐसे होते हैं, जो C++ की Source File के लिए होते हैं और कुछ Statements ऐसे होते हैं, जो C की File के लिए होते हैं। इस स्थिति में हमें ये तय करना होता है कि कौनसा Code C++ की File के लिए है और कौनसा Code C की File के लिए है। __cplusplus Macro Identifier द्वारा हम यही तय करते हैं।

यदि हम File को .CPP Extension से Save करते हैं, तो File में __cplusplus Macro स्वयं ही Define हो जाता है, जबकि ऐसा ना करने पर ये Macro Define नहीं होता है और Compiler #error के आगे लिखे Statements को Error के रूप में Display कर देता है।

साथ ही चूंकि हमने #error Directive का प्रयोग किया है, इसलिए Source File Compile होने से पहले ही Terminate हो जाती है। यानी File Compile नहीं होती है। जब इस File को .CPP Extension से Save करके Run किया जाता है, तब हमें निम्नानुसार Output प्राप्त होता है:

__STDC__ Macro Identifier Define करने के कारण Compiler केवल Standard C व C++ Codes को ही Source File में Implement करने देता है। यदि हम कोई Nonstandard Code Source File में Use करें, तो Compiler हमें इस Directive को Defined करने के कारण ऐसा नहीं करने देता है।

जब हम File को Compile करते हैं, तब Compiler Source File को Object File में Convert करने की Date को __DATE__ नाम के Macro में Store कर देता है। इसी तरह से __TIME__ Macro में वह समय Store हो जाता है, जिस समय File Compile होती है। ये दोनों ही मान String Format में Stored रहते हैं, जिन्हें Output में Print करवाया जा सकता है।

# and ## Preprocessors

सामान्‍यतया इनका प्रयोग define के साथ ही होता है। # Operator के बाद जो भी कुछ लिखा जाता है, वह String की तरह Behave करता है तथा ## Concatenating करने का काम करता है। इसे समझने के लिए निम्न उदाहरण देखते हैं:

// Program
#include <stdio.h>
#include <conio.h>
#
#define str(s) # s
#define concat(x, y) x ## y

void main(void)
{
   int xy = 100;
	printf(str(This is all about Macro));
   printf("\n Value of xy is : %d", concat(x, y));
}

// Output 
    This is all about Macro
    Value of xy is : 100

यदि हम किसी Program में केवल # का प्रयोग करें और उसके आगे कुछ ना लिखें तो Compiler अकेले एक # को Ignore कर देता है, जैसाकि इस Program में किया गया है। इसे Null Directive कहते हैं।

Preprocessor Directives in C
Conditional Compilation and File Inclusion Directives

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 DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।