暂时感觉像是由于“;”的原因,关于使用习惯方面的问题!!

下面是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 语言宏定义

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 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 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...

随机推荐

部署到IIS上的网站打开时总是显示无法找到资源解决方案

1.首先修改项目目录的访问权限:右键->属性->安全里面找到组名或用户名 ->编辑->添加一个用户取名everyOne并设置可以修改即可 2.然后在IIS下面,选中你的mvc项 ...

ELF Executable Reconstruction From A Core Image

catalog . INTRODUCTION . THE PROCESS IMAGE . THE CORE IMAGE . EXECUTABLE RECONSTRUCTION . FAILURES I ...

Struts2标签实现for循环

感悟:但是不建议使用这种方法,按照MVC框架的思想 ,应该把业务更多放在后台.前台尽量只进行数据展示. 转自:http://blog.csdn.net/guandajian/article/detai ...

enableEventValidation

回发或回调参数无效.在配置中使用 或在页面中使用

零门槛,包教会。让你在5分钟内使用以太坊ERC20智能合约发行属于自己的空气币

前言 目前区块链是互联网中最最火的风口,没有之一.我周围的很多朋友也加入了“炒币”行列,但很不幸,几乎都被“割韭菜”了.而经过我的几天研究,发现,如果自己要发行一种空气币,简直太简单了.只需要下面几个 ...

mysql 表

关系 create table scores( id int primary key auto_increment, stuid int, subid int, score decimal(5,2) ...

Spring-boot(二)--thymeleaf

@Controller @RequestMapping("/") public class MessageController { private final MessageRep ...

openstack-- neutron 二/三层网络实现探究

引出 Neutron 是openstack 中提供网络虚拟化的组件,根据二层网络的实现方式不同(即agent的不同),可以分为Linux bridge的方式,Openvswitch的方式.而且,lay ...

HDU 2089 不要62(数位dp模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

Python基础:内置常量

本文根据Python 3.6.5的官文Built-in Constants编写,官文比较短,大家可以直接看原文. 有一些存在于 内置名称空间(the built-in namespace) 的常量,如 ...

c语言 宏do while,关于C语言宏定义 使用do{ xxxx }while()相关推荐

  1. 自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解

    如题所述,最近时间在复习C语言.自己实现了一个C语言例程,以加深对宏.大小端.typeof宏.offsetof宏.指针变量.结构体.联合体的理解.关于细分知识后续有空再填充- swap宏的使用: 对应 ...

  2. 【C语言进阶深度学习记录】十七 宏定义的使用与分析

    文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...

  3. C语言 第八章 函数、指针与宏

    一.函数 函数是一个包含完成一定功能的执行代码段.我们可以把函数看成一个"黑盒子", 你只要将数据送进去就能得到结果, 而函数内部究竟是如何工作的的, 外部程序是不知道的.外部程序 ...

  4. c语言宏定义比较三个数大小,C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义。...

    1.C语言中两个宏进行大小对比,其中一个没有定义,这种行为如何定义呢? 在学习U-boot的过程中遇到这么一个定义: # if (CONFIG_ENV_ADDR >= CONFIG_SYS_MO ...

  5. c语言宏定义在预处理阶段,预处理和宏定义

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 宏定义 基本概念预处理部分: #include #define 放在函数之外,一般都放在源文档的前面 预处理由预处理进程 ...

  6. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  7. c语言如何增加编译宏,C中的预编译宏定义

    在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏( ...

  8. c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...

    2019/04/27 16:02 1.宏的定义:宏定义就是预处理命令的一种,它允许用一个标识符来表示一个字符串.格式如下: #define name(宏名) stuff(字符串) 本质就是使用宏名去替 ...

  9. 交大c语言第二次作业答案,C语言程序设计第二次作业题及答案.doc

    C语言程序设计第二次作业题及答案 第2次作业一.单项选择题(本大题共60分,共 20 小题,每小题 3 分)1. #inlucde 是一条(?? ).A. 文件包含预处理命令B. 宏定义预处理语句C. ...

最新文章

  1. redis c客户端 hiredis
  2. mybatis查询时间段sql语句
  3. 0. VS2015快捷键
  4. vi 技巧和诀窍:令人刮目相看的 10 个超酷命令
  5. 【推荐系统】深入理解推荐系统:排序
  6. 2017 ICPC沈阳区域赛
  7. java 语法 泛型_java-解密泛型语法
  8. idea多行编辑_开发神器idea被玩残了,你们功不可没啊!
  9. ajax 制作表格带查询参数,查询表格——建立动态表格,使用ajax输入查询条件将后台数据查询出来以表格的形式展示出来...
  10. 启动报错:Error creating bean with name ‘XXX’ defined in...
  11. 30道Linux面试题
  12. 拓端tecdat|R语言有状态依赖强度的非线性、多变量跳跃扩散过程模型似然推断分析股票价格波动
  13. 微信的那个老外产品经理,又写了一篇《中国移动应用设计趋势》
  14. 进制转化——2022蓝桥杯(E题)
  15. 倾斜摄影技术构建 WebGIS 智慧展馆 | 图扑软件
  16. SSH2(Struts2、Spring3与Hibernate3)的整合
  17. Lintcode:报数
  18. 【李沐】深度学习笔记
  19. 用例建模-绘制用例图
  20. win10计算机配置在哪里打开,详细教您win10设备管理器在哪打开

热门文章

  1. SpringBoot 导出Word文档(doc\docx) Office无法打开,WPS正常等坑
  2. Android 集成Xposed框架
  3. 一文熟悉 Go 的循环结构 —— for 循环
  4. 我的 5 年 Android 学习之路,那些年一起踩过的坑
  5. 第一次作业——肖祥英
  6. 计算机网络--串行传输与并行传输
  7. 计算机基础学习-什么是并行传输、串行传输、异步传输?
  8. ITIL 4Foundation题目-6
  9. 什么是大小端?如何确定大小端?
  10. C++ 内存管理 - primitives - 侯捷