宏定义问题
#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);
还是通不过。
宏定义有关问题
宏定义问题#defineDOCVIEWER_TO_CLIP_COORDINATION(CX1,CY1,CX2,CY2,X1,Y1,X2,Y2)\do{\CX1X1\CY1Y1\CX
