為什麼C語言中複雜的函數式宏定義常用do while(0)的方式定義?

为什么C语言中复杂的函数式宏定义常用do while(0)的方式定义?

我们用一个例子来说明吧。

假如我们想用宏实现打印某数的整数部分和小数部分,最简单的实现是:

<code> 
 
    

int

iIntPart; \

double

dDecimalPart; \ iIntPart = (

int

)num; \ dDecimalPart = num - iIntPart; \ printf(

"Integer part: %d\n"

, iIntPart); \ printf(

"Decimal part: %lf\n"

, dDecimalPart);

void

main

(

)

{ PrintNumber(

12.89

); }/<code>

上面的程序可以正常运行:

<code>

Integer part:

12

Decimal part:

0.890000

/<code>

但如果这样使用PrintNumber就会出错:

<code>

float

fValue = -

32

.

12

;

if

(fValue >

0

) PrintNumber(fValue);/<code>


为什么C语言中复杂的函数式宏定义常用do while(0)的方式定义?

怎么办呢?

我们可以把宏体用花括号包含起来,就像定义函数一样

<code> 
 
  

\ int iIntPart; \ double dDecimalPart; \ iIntPart = (int)num; \ dDecimalPart = num - iIntPart; \ printf("Integer part: %d\n", iIntPart); \ printf("Decimal part: %lf\n", dDecimalPart); \ }

void

main()

{

float

fValue = -32.12;

if

(fValue > 0)

PrintNumber(fValue);

}

/<code>

现在似乎可以高枕无忧了。

但是又有人发现,如果这样使用PrintNumber还是会出错:

<code>

if

(fValue >

0

)

PrintNumber

(fValue);

else

printf

(

"Errror! The value is less than 0.\n"

);/<code>

显然,出错的原因是因为多了一个分号。

如何处理,才能让这个宏和函数的使用效果一样呢?


为什么C语言中复杂的函数式宏定义常用do while(0)的方式定义?

不知道哪个天才,首先使用do while句式,解决了难题:

<code> 
 

do

{ \

int

iIntPart; \

double

dDecimalPart; \ iIntPart = (

int

)num; \ dDecimalPart = num - iIntPart; \ printf(

"Integer part: %d\n"

, iIntPart); \ printf(

"Decimal part: %lf\n"

, dDecimalPart); \ }

while

(

0

)

void

main

(

)

{

float

fValue =

-32.12

;

if

(fValue >

0

) PrintNumber(fValue);

else

printf(

"Errror! The value is less than 0.\n"

); }/<code>

使用do-while句式,可以吸掉一个分号,让我们可以像使用函数一样,来使用宏。


谢谢您的阅读!


#科技新星创作营#


分享到:


相關文章: