先来看宏定义的一个经典例子;使用MFC;新建单文档工程,把宏定义在视类CPP文件头部;
void CHongdoView::OnDraw(CDC* pDC)
{
CHongdoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString str1;
int x = 101, y = 202;
swap(x, y);
//printf("%d %d\n", x, y);
str1.Format("%d %d", x, y);
pDC->TextOut(20, 20, str1);
}
输出如下;
如果如下使用宏,看上去没错;但是不能通过编译;因为宏展开之后if分支后的语句的分号出了问题;
如果如下图写就没问题;去掉if分支之后的语句的分号; 但是这么写容易误导,因为语句之后没有分号;
如果如下图定义宏,就可以适应if-else;
使用宏和运行结果如下图;
扫描二维码关注公众号,回复:
12923374 查看本文章
我还没遇到这种情形; 最初见到在宏定义使用 do{}while(0) 是在浏览Linux源码时;