I have a macro

#define SWAP(X,Y) { X = X+ Y; Y = X - Y; X = X - Y; }

So, The above macro swaps two numbers.

I can use

int x = 5, y =4;

SWAP(x,y);

Works perfect.

Now I will use the same as

if ( x > 0)

SWAP(X,Y);

The above one also works fine.

Now

if ( x > 0)

SWAP (x,y);

else

printf("\n X is Below Zero");

So..will the above works.

Noooo..

Before getting solution let us understand the problem my expanding:

if (x > 0)

{

x =x + y;

y = x - y;

x = x -y;

};

else

printf("\n X is Below Zero");

If we compile the above we will get the error like "

"ERROR!!! "parse error before else"

Because of the extra semi-colon before Else.

So, the solution is embed the multi-staement macro between do-while(0) loop :)

So, the macro defination would be

#define SWAP(X,Y) \

do { \

X = X+ Y; \

Y = X - Y; \

X = X - Y; \

}while (0)

Thats it..

This is the safest way of using multi-statemetn macros ..

OR

There is another Simple way which is bruit-forcing a coding standard for coders ...and here is the rule:

Never forget to use parenthesis even the functional block has one statement

that means

instead of using

if (x > 0)

SWAP (x,y);

else

printf("\n X is Below Zero");

we should use :

if (x > 0)

{

SWAP(x,y);

}

else

{

printf("\n X is Below Zero");

}

Nice post. Thanks for the detailed analysis.

ReplyDelete