关于C语言宏定义 使用do{ xxxx }while()
暂时感觉像是由于“;”的原因,关于使用习惯方面的问题!!
下面是copy的:
这样的宏见过么:
Cpp代码
- #define FOO(x) do {\
- some_code_line_1;\
- some_code_line_2;\
- } while (0)
(注意while(0)后面没有分号)
乍一看这个宏不过就是定义了个包含多个语句的local scope,用do..while(0)包围起来简直多此一举。直接这样不就好了么:
Cpp代码
- #define FOO(x) {\
- some_code_line_1;\
- some_code_line_2;\
- }
但问题是这两者不等价……
关键问题是前者定义出来的宏是一个非复合语句,而后者是一个复合语句。C/C++里有些语法结构对复合/非复合语句之间的区别是敏感的,例如说:
Cpp代码
- if ( someCond )
- FOO(x);
- else
- //...
要是FOO(x)展开后是一个复合语句,那么FOO(x)后面的分号“;”就会终结整个if语句,导致else子句孤立而出现编译错误。
所以关键是那个while(0)后面不加分号。如果加了分号的话就没意义了。
如果用复合语句版本的宏,就要记得不写那个分号:
Cpp代码
- if ( someCond )
- FOO(x)
- else
- //...
但是这样与一般的函数调用风格不统一,所以很多人倾向于使用do..while(0)这个trick来把local scope包起来而不是直接用复合语句({..})。
印象中这类的宏还有一个变种,
Cpp代码
- #define FOO(x) switch(0) default: ...
还是怎样的。具体是怎么写的忘记了……以后想起来的话一定得记下来 T T
关于C语言宏定义 使用do{ xxxx }while()的更多相关文章
- C 语言宏定义
C 语言宏定义1.例子如下: #define PRINT_STR(s) printf("%s",s.c_str()) string str = "abcd"; ...
- 将C语言宏定义数值转换成字符串!
将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 ...
- C语言 宏定义之可变参数
可变参数宏定义 C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏.可变参数宏就像下面这个样子: #define dbgprint(. ...
- C语言宏定义时#(井号)和##(双井号)的用法1
#在英语里面叫做 pound 在C语言的宏定义中,一个#表示字符串化:两个#代表concatenate 举例如下: #include <iostream> void quit_comman ...
- C语言宏定义时#(井号)和##(双井号)的用法
C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结. 关于#和## 在C语言的宏中,#的功能是将其后面 ...
- c语言宏定义
一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时 ...
- C语言宏定义相关
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义......1,防止一个头文件被重复包含#ifndef COMDEF_H# ...
- 转:C语言宏定义时#(井号)和##(双井号)的用法
转自:http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html#2678295 #在英语里面叫做 pound 在C语言的宏 ...
- c语言宏定义#define的理解与资料整理
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...
随机推荐
- Windows下安装Python lxml库(无废话版)
python官网:python-2.7.12.amd64.msihttps://pypi.python.org/pypi/setuptools:setuptools-28.6.0.zipsetupto ...
- 7. ensemble learning & AdaBoost
1. ensemble learning 集成学习 集成学习是通过构建并结合多个学习器来完成学习任务,如下图: 集成学习通过将多个学习学习器进行结合,常可以获得比单一学习器更优秀的泛化性能 从理论上来 ...
- zabbix 自定义探索规则发现服务器上面的kvm虚拟机和对应的网卡
安装完zabbix服务器之后 只有两个探索规则模版,挂载点探索和网卡探索 场景描述:想使用zabbix监控kvm虚拟机的网卡的流量情况, 获取虚拟机和网卡对应关系 虚拟机 S-1 virsh domi ...
- log4j+mongodb
maven 配置: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java ...
- 本机,同机房,同城,异地,不同城,腾讯云ping延时值
本机,同机房,同城,异地,不同城,腾讯云ping延时值 ping本机: 0.01ms ping同机房机器: 0.1ms ping同城机器: 1ms ping不同城机器: 20ms 北(南)方ping南 ...
- C#类和接口
1.类的定义 C#使用类关键字class定义类,如: public class MyClass { } 2.类的继承 类继承使用: public class BaseClass { } public ...
- AngularJS Best Practices: resource
A factory which creates a resource object that lets you interact with RESTful server-side data sourc ...
- Html5三维全景
先看DEMO:http://think.weiyingjia.cn/liuming/quanjing/out.html 准备: 1.一张或多张全景图片素材 2.pano2VR软件,链接:http ...
- Hdu 1009 FatMouse' Trade
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- CentOs中yum安装LAMP+PHPMYADMIN
对于租用以及VPS,提供在Linux安装LAMP(Linux+Apache+mysql+PHP),对于这个组件,不做过多的解释,网上很多这方面的资料.下面只介绍一种安装方法,作为以后使用的一个简单文档 ...