宏定义有关问题

宏定义问题#defineDOCVIEWER_TO_CLIP_COORDINATION(CX1,CY1,CX2,CY2,X1,Y1,X2,Y2)\do{\CX1X1\CY1Y1\CX

宏定义问题
#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循环式做什么用的呀,我觉得只要加个大括号就可以了

[解决办法]

这样的好处很明显,比如我们可以使用
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);
这样的表达式不会出错。
仅仅使用花括号就不行。

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

[解决办法]
do{}while(0)的宏定义就是为了能在宏后面加分号。

如果只是单纯的{}的宏,后面不能添加分号。
[解决办法]
恩。值得研究一下。如下的两段(#1 #2)一样吗?

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


// #2:
{
x = 1;
y = 1;
z = 1;
}
[解决办法]
这是一种预防性措施。如下:
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);
还是通不过。