为什么一些宏不用{}而用do{}while(0)

2024-03-30 03:32
文章标签 不用 而用

本文主要是介绍为什么一些宏不用{}而用do{}while(0),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自从工作以来偶尔会在代码里见到一些do{}while(0)形式的宏定义,但是当初并不知道这样做的目的是什么,总觉得单单用一下{}就可以实现相同的功能了。
最近在看linux内核源码,里面有一堆do{}while(0)的宏,于是查了一下,发现有的情况只能用do{}while(0)的形式来定义宏,用单纯的{}会导致报错。
实验代码如下:

#include <stdio.h>#define MACRO_DO_WHILE_ZERO(enable, fmt, args...)do { if (enable)	\printf(fmt, ##args); \} while(0)int main(int argc, char **argv)
{if(1)MACRO_DO_WHILE_ZERO(1, "%s\n", "true print");elseMACRO_DO_WHILE_ZERO(1, "%s\n", "false print");return 0;
}

在这种情况下,用do{}while(0)的宏可以编译通过。

#include <stdio.h>#define MACRO_BRACE_ONLY(enable, fmt, args...){ if (enable)	     \printf(fmt, ##args); \}int main(int argc, char **argv)
{if(1)MACRO_BRACE_ONLY(1, "%s\n", "true print");elseMACRO_BRACE_ONLY(1, "%s\n", "false print");return 0;
}

这种情况下编译会报错:
在这里插入图片描述

这篇关于为什么一些宏不用{}而用do{}while(0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/860375

相关文章

win10不用anaconda安装tensorflow-cpu并导入pycharm

记录一下防止忘了 一、前提:已经安装了python3.6.4,想用tensorflow的包 二、在pycharm中File-Settings-Project Interpreter点“+”号导入很慢,所以直接在cmd中使用 pip install -i https://mirrors.aliyun.com/pypi/simple tensorflow-cpu下载好,默认下载的tensorflow

git中,隐藏application.properties文件,修改不用提交了

git中,隐藏application.properties文件,修改不用提交了 A、将文件名放入 .gitignore 文件中 B、执行git命令隐藏文件         执行在ide上执行命令         a、执行隐藏命令 git rm --cached src/main/resources/application.properties          b、执行提交命

使用Mybatis Generator插件生成纯净代码,自定义扩展注释和注释,xml映射文件,不用修改源码!!!

先看效果: (基于Mybatis-generator-core-1.4.0) 生成模型(实体): 根据MySQL库中的tb_prod_info表字段及注释自动生成. package com.ezsyn.cloudstudy.product.dao.entity;import io.swagger.annotations.ApiModelProperty;import lombok.Gette

不用饿汉和锁实现线程安全的单例模式

前言 面试官不让用饿汉和锁,要求实现线程安全的单例,记录下使用原子类的解法; 代码 SingletonWithoutLock.java import java.util.concurrent.atomic.AtomicReference;/*** @author jhz* @date 19-8-10 下午11:55*/public class SingletonWithoutLock {

重磅!微信放开公众号注册限制!只要手机号,不用实名!

重磅!微信放开公众号注册限制!只要手机号,不用实名! 随着移动互联网的发展,微信公众号已经成为了许多个人与企业传递信息、分享内容的首选平台。就在近日,微信官方再次放出大招:公众号注册无需实名,只要有手机号就能完成注册!这个改变不仅为个人创造更多机会,也为企业开拓了全新的矩阵传播模式。 🔑 关键词:微信公众号注册、无需实名、矩阵传播 在这篇文章中,我们将深入探讨这一重大政策变化带来的影响和机

不用upper和lower方法实现大小写转换

不用upper和lower方法实现大小写转换 def to_upper(input_str: str) -> str:"""将字符串中的所有小写字母转换为大写字母。参数:input_str (str): 要转换的字符串。返回:str: 一个新的字符串,其中所有小写字母都已转换为大写字母。非字母字符保持不变。"""output_str = "" # 初始化一个空字符串,用于构建输出for ch

基本不用CSDN了,我的博客在niaobulashi.com上

很早就创建的博客 博客地址:鸟不拉屎 又名:南屿北岛

再也不用来回切换了,多微同一界面聚合聊天

手上有多个微信,工作时经常要来回切换登录,才能处理聊天和发圈等工作,来回切换不但容易导致号的状态存在异常,还会浪费很多时间登录,忙的时候还可能会导致处理不及时。 今天必须要给你们分享这个超棒的东西! 微信聚合系统真的太方便啦!它就像是一个强大的中枢,将我们所有的微信相关信息都整合在了一起。 不管是多个微信号的消息,还是各种群组的资讯,都能一站式管理,再也不用在多个界面来回切换啦,大大提高了效

AI写的不用游标派发明细数量例子

需求: 请在sqlserver设计数据库表以及编写sql实现如下需求:有个课目奖金表,登记各课目奖金池; 一个班有36位学生,每人每课目成绩不同,按学号顺序,如果成绩在90-100之间奖励200块,80-89之间奖励100块,70-79之间奖励50,其他不奖励,要考虑奖金是否派完的情况,最好不要用游标实现。首先,学生表要有金额字段,先更新金额字段然后显示这个表内容和各课目奖金池剩余金额 其实这

别说,Cerebro还真好用!老板再也不用担心ES集群了

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 Cerebro 是以前的 Elasticsearch 插件 Elasticsearch Kopf 的演变(https://github.com/lmenezes/elasticsearch- kopf) – 这不适用于 Elasticsearch 版本5.x或更高版本。它是查看分片分配和最有用的界面之一,通过图形界面执行常见的索