宏定义问题

WuYL7812 2007-05-18 11:07:38
#define DOCVIEWER_TO_CLIP_COORDINATION(CX1, CY1, CX2, CY2, X1, Y1, X2, Y2) \
do{\
CX1 = X1;\
CY1 = Y1;\
CX2 = X2;\
CY2 = Y2;\
if(CX1 < DOCVIEWER_SCREEN_X) CX1 = DOCVIEWER_SCREEN_X;\
if(CX2 > DOCVIEWER_SCREEN_END_X) CX2 = DOCVIEWER_SCREEN_END_X;\
if(CY1 < DOCVIEWER_SCREEN_Y) CY1 = DOCVIEWER_SCREEN_Y;\
if(CY2 > DOCVIEWER_SCREEN_END_Y) CY2 = DOCVIEWER_SCREEN_END_Y;\
}while(0);

在这个宏里,while循环式做什么用的呀,我觉得只要加个大括号就可以了
...全文
287 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuYL7812 2007-05-18
  • 打赏
  • 举报
回复
to yutaooo(旦见散分需快进, 莫等分尽空遗恨! → 今天,你散了没有) ( )
为了产生一个复合语句。while本身没作用。但没有的话,复合语句如何写出来呢?
------------------------------------------------------------------------
怎么不能写了?
jixingzhong 2007-05-18
  • 打赏
  • 举报
回复
一些防护性措施。

由于宏的 简单替换性,
完全没有任何检查,
所以可能宏被和其他宏或者代码叠加,
得到一些非预期的结果。

使用 do{}while(0) 可以显式的把这段宏所代表的代码独立封装,
不会被其他宏或者代码重叠造成非预期结果。
yutaooo 2007-05-18
  • 打赏
  • 举报
回复
算是个技巧,戏法吧。
yutaooo 2007-05-18
  • 打赏
  • 举报
回复
为了产生一个复合语句。while本身没作用。但没有的话,复合语句如何写出来呢?
xiantongyuan 2007-05-18
  • 打赏
  • 举报
回复
可能是为了以后的扩展吧,不过在这里好象是一样的。
intuition444 2007-05-18
  • 打赏
  • 举报
回复
和这个函数是一样的

DOCVIEWER_TO_CLIP_COORDINATION(CX1, CY1, CX2, CY2, X1, Y1, X2, Y2)
do{
CX1 = X1;
CY1 = Y1;
CX2 = X2;
CY2 = Y2;
if(CX1 < DOCVIEWER_SCREEN_X) CX1 = DOCVIEWER_SCREEN_X;
if(CX2 > DOCVIEWER_SCREEN_END_X) CX2 = DOCVIEWER_SCREEN_END_X;
if(CY1 < DOCVIEWER_SCREEN_Y) CY1 = DOCVIEWER_SCREEN_Y;
if(CY2 > DOCVIEWER_SCREEN_END_Y) CY2 = DOCVIEWER_SCREEN_END_Y;
}while(0);
poo2004 2007-05-18
  • 打赏
  • 举报
回复
这是一种预防性措施。如下:
1。定义一个宏:
#define SUM(a, b) a = a + 1; b = a + b;
那么在if-else结构中处理就会有问题:
if(a)
SUM(a, b);
else
exit(1);
经过预处理后,这段代码就会变成:
if(a)
a = a + 1;
b = a + b;
else
exit(1);
编译这段代码时将出错。
2。如果在上面那个宏加个{},预处理后将会成这样:
if(a)
{
a = a + 1;
b = a + b;
};
else
exit(1);
还是通不过。
dogygb 2007-05-18
  • 打赏
  • 举报
回复
hzcpig() 说的倒不错~~~可以加“;”在后边了
freshui 2007-05-18
  • 打赏
  • 举报
回复
呵呵 这下说的应该够明白了吧 :)
freshui 2007-05-18
  • 打赏
  • 举报
回复
while(0) 后面不能有分号

比如
#define Add(a, b) do{ a++; a+b;
}while(0)

if(a)
add(a,b);
else
...
如果while(0)后面有分号, 那么会有两个连续的分号, 这样if else就不配对了

同理 如果没有do while(0) 只是和大括号
展开变成:
if(a)
{}
;
else
...
也会多出一个分号, 同样if else不配对


主要是为防止这个的.
yutaooo 2007-05-18
  • 打赏
  • 举报
回复
恩。值得研究一下。如下的两段(#1 #2)一样吗?

// #1:
do {
x = 1;
y = 1;
z = 1;
}
while(0);


// #2:
{
x = 1;
y = 1;
z = 1;
}
winner8080 2007-05-18
  • 打赏
  • 举报
回复
还是不明白,
没中要害
dogygb 2007-05-18
  • 打赏
  • 举报
回复
就是分号问题?
dogygb 2007-05-18
  • 打赏
  • 举报
回复
quote:
--------------------------------------------------------------------------------
这样的好处很明显,比如我们可以使用
if(a)
DOCVIEWER_TO_CLIP_COORDINATION(CX1, CY1, CX2, CY2, X1, Y1, X2, Y2);
else
DOCVIEWER_TO_CLIP_COORDINATION(CX1, CY1, CX2, CY2, X1, Y1, X2, Y2);
这样的表达式不会出错。
仅仅使用花括号就不行。

但是如果只有一个语句,完全没有必要。
-----------------------------------------------------------------------------------


为什么仅仅使用花括号就不行呢 ???
hzcpig 2007-05-18
  • 打赏
  • 举报
回复
do{}while(0)的宏定义就是为了能在宏后面加分号。

如果只是单纯的{}的宏,后面不能添加分号。
freshui 2007-05-18
  • 打赏
  • 举报
回复
还有, 你的也写错了
while(0) 后面不能跟分号
freshui 2007-05-18
  • 打赏
  • 举报
回复

这样的好处很明显,比如我们可以使用
if(a)
DOCVIEWER_TO_CLIP_COORDINATION(CX1, CY1, CX2, CY2, X1, Y1, X2, Y2);
else
DOCVIEWER_TO_CLIP_COORDINATION(CX1, CY1, CX2, CY2, X1, Y1, X2, Y2);
这样的表达式不会出错。
仅仅使用花括号就不行。

但是如果只有一个语句,完全没有必要。

70,034

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧