C语言宏定义中使用 do{}while(0) 的情形

先来看宏定义的一个经典例子;使用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源码时;

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/115136352