先来看宏定义的一个经典例子;使用MFC;新建单文档工程,把宏定义在视类CPP文件头部;

void CHongdoView::OnDraw(CDC* pDC)
{CHongdoDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString 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;

使用宏和运行结果如下图;

我还没遇到这种情形;   最初见到在宏定义使用 do{}while(0) 是在浏览Linux源码时;

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

  1. 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法

    C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...

  2. C语言宏定义中#号的作用

    C语言宏定义中#号的作用 前言 #号的作用 前言 最近,在阅读uboot的源码过程中,发现了一段宏定义代码: #define U_BOOT_CMD_MKENT_COMPLETE(_name, _max ...

  3. c程序语言符号的作用,c语言宏定义中的#,##,#@及\符号的作用

    1.#(stringizing)字符串化操作符 作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定   义中,且必须置于宏定义体中的参数名前. 如: #def ...

  4. c语言井号字符什么意思,关于c语言宏定义中的单#(井号)和双#(井号)

    看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了. 单井号就是将后面的 宏参数 进行字符串操作,就是将后面的参数用双引号引起来 双井号就是用于连接. 比如文章中的例子: #defi ...

  5. C语言宏定义中的字符串替换

    ## 是连接符号,连接两个字符串 #是把名字代替成参数中的字符串 #define PRINTF(value)  printf( #value " = %d/n", value ); ...

  6. C语言宏定义中UL的含义

    1.U表示 unsigned 无符号,L表示 long 长整数.后缀大小写都可以,可以单独使用(100U),也可以组合使用(100UL). 2.F表示float,但是F不可以和U组合,因为浮点数没有u ...

  7. C语言宏定义中#define中的井号#的使用

    #include <stdlib.h> #include <stdio.h> #include <string.h>typedef enum {E_1,E_2,E_ ...

  8. c语言 宏定义 去除宏定义_如何检查是否在C中定义了宏?

    c语言 宏定义 去除宏定义 To check whether a Macro is defined or not in C language – we use #ifdef preprocessor ...

  9. c语言长度宏定义运算符,C语言在宏定义中使用语句表达式和预处理器运算符

    语句表达式的亮点在于定义复杂功能的宏.使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞.下面以一个简单的最小值的宏为例子一步步说明. 1.灰常简单的么,使用条件运算符 ...

最新文章

  1. 2019最具特色的web前端技术分享
  2. java学习笔记(九)----多线程
  3. 关于jQuery.click()函数
  4. android和ios HybridApp的js交互
  5. 个人电脑的楷模:新款IMac G5
  6. zabbix监控mysql操作
  7. h5的fetch方法_HTML5 fetch API
  8. java装箱和拆箱的意义_java的自动拆箱和装箱是每个程序员都要知道的
  9. Matlab Tricks(二十一)—— 软阈值函数的实现
  10. mysql常用功能点
  11. kali之破解隔壁老王wifi
  12. Python——自动签到脚本
  13. 用python写猜数字游戏
  14. firewalld防火墙配置IP伪装和端口转发
  15. 关于win11兼容性视图模式
  16. 211毕业生3天被辞退:offer不等于工作稳了!
  17. UpdateData() 函数
  18. 【C语言】scanf函数报错
  19. javascript动态构建函数
  20. ava程序员必看基础书籍

热门文章

  1. Timer的schedule和scheduleAtFixedRate方法的区别解析
  2. STM32的USB相关资料(转载)
  3. CTFshow php特性 web104
  4. poj2065 SETI
  5. caffe中mnist数据集的运行
  6. C++中输入输出的十六进制八进制
  7. uicontrol图形对象用户界面的用法
  8. 用界面读取图片并且保存图片的方法
  9. 无忧考吧2017二级java_无忧考吧二级JAVA超级模拟软件下载_无忧考吧二级JAVA超级模拟软件官方下载-太平洋下载中心...
  10. 重根迭代法解方程(两种方法)(Python实现)