条件编译#ifdef MACRO_A和#if defined(MACRO_A)的区别_macro ifdef_David_xtd的博客-程序员宅基地

技术标签: c  编译  Linux  linux内核  

在查阅linux内核源码的过程中,发现存在两种不同类型的条件编译语句:#ifdef MACRO_A和#if defined(MACRO_A)或#if !defined(MACRO_A)

#ifdef和#ifdefined()之间的区别

实际上,两者并无本质的差别,但后者的应用范围更广,能支持多个预编译变量的检查。

#if defined(MACRO_A) && !defined(MACRO_B)
#endif
如果用前者的方式来表达,只能使用嵌套的条件判断

#ifdef(MACRO_A)
    #ifndef(MACRO_B)
        ...;
        ...;
    #endif
#endif


后来,在源码中又看到了这样的条件语句:

#define CONFIG_RMII            0

在c文件中,这样使用宏定义:

#ifdef CONFIG_RMII
    macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
#else
    macb_writel(macb, USRIO, 0);
#endif

我的编译结果是,不管将CONFIG_RMII设为0或1,编译出来的二进制文件,除了编译时间不同,其他都一样。

这说明对该宏的使用有误。

从网上查了些资料,发现是对#if和#ifdef的区别不清楚所导致。

#if和#ifdef之间的区别

对于#if后面需要是一个表达式,如果表达式为1则调用#if下面的代码。
对于#ifdef后面需要的只是这个值有没有用#define定义,并不关心define的这个值是0还是1。


要使得判别条件#ifdef结果为假,也就是不执行判别条件后面所跟的语句,需要对#ifdef后面所跟的宏使用#undef语句进行声明。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/David_xtd/article/details/7669028

智能推荐

MySQL索引 B+树 覆盖索引 回表操作 联合索引与最左前缀匹配原则 索引下推技术 B+树的四大特点及索引回顾_innodb 最左匹配原则和b+树的联系_琴声浮或沉__听懂只一人的博客-程序员宅基地

文章目录一、 什么是索引二、 为何要用索引三、 如何正确地看待索引四、理解索引的储备知识五、索引分类六、创建索引的两个步骤七、B+树演变过程二叉树平衡二叉树平衡二叉树B树B+树八、B+树分两大类利用非聚集索引查找数据九 覆盖了索引、回表操作十、索引管理常用的索引分类十一 测试索引十二、联合索引与最左前缀匹配原则让我们带着以下问题展开对索引的探索1、为何索引叫key2、索引是如何加速查询的,它的原理是啥?索引模型/结构从二叉树-》平衡二叉树-》b树最后到b+树,每种树到底有什么问题最终演变成到了b+_innodb 最左匹配原则和b+树的联系

【Spring cloud gateway 获取RequestBody】_springcloud 获取body_任小可的博客-程序员宅基地

此类主要继承 ReadBodyRoutePredicateFactory 一定要自己查看下此类/*** @Description gateway 中 读取 请求的jsonBody* 这里是 将 请求数据中的json 放到 'cachedRequestBodyObject' 此属性中// 此类可重写,亦可不重写 ,根据自己需要 // 父类方法完全够我用的,所以不做改动 }继承Predicate 由于我们能的json 是字符串 所以是String类型/**/**_springcloud 获取body

linux常用命令大全-程序员宅基地

linux常用命令加实例大全目 录引言 1一、安装和登录 2(一) login 2(二) shutdown 2(三) halt 3(四) reboot 3(五) install 4(六) mount 4(七) umount 6(八) c

【Docker】容器技术黑马Docker(一)——了解容器技术,了解Docker_在镜像的基础上加入了可写层,进行执行环境-程序员宅基地

一、前言 说到容器,小编最先接触的容器还是tomcat这些web容器,感觉容器就是把应用程序装进去,应用程序在容器中运行,我们可以通过访问容器暴露的端口来访问容器中的应用程序。 再说到容器技术,这个就厉害了。 这里小编就重点介绍一下容器技术的发展以及容器技术的黑马Docker。二、容器技术发展 小编觉得这张图非常棒,涵盖了容器技术的演变。 容器技术最早可以追溯_在镜像的基础上加入了可写层,进行执行环境

RESTFul-service guideline-程序员宅基地

1. Spring MVC到 JAX-RS的迁移指导1.2 WHY1.3 HOW1.3.1 配置Jersey1.3.2 配置RESTEasypom.xml 中的配置web.xml增加一个javax.ws.rs.core.Application的子类关于和Spring bean的集成,需要一些特殊的配置,否则无法注入spring的bean。...

【嘉兴东臣PHP】html5与css3-程序员宅基地

HTML5 是HTML4的升级版。不是特定的开发语言。目前支持的浏览器有 safari、opera 、firefox 、 chrome、ie 但是较老的版本不支持。标签:<audio> 音乐播放器 controls=“controls” 为显示音乐播放器面板 ...

随便推点

软件项目失败的心理原因_软件项目进度未完成原因分析怎么写-程序员宅基地

这是一篇有关软件工程领域中事务状态的评论文章。它讨论了程序员的实际挑战和实际职责。它把程序员分为四个类别:聪明、强盗、无助和愚蠢,另外两个类别是天真和无知。它讨论了程序员必须如何熟悉特定领域,不仅能够编码,而且实际上可以创建解决方案。它涉及到敏捷软件开发的失败。免责声明本文是我对软件工程领域中事务状态的个人看法。这并不是要成为科学论文,因此有许多陈述是故意加粗和直接的,以使文章简短。我尽力根据自己的观察和可用的资料指出软件项目失败的心理原因,但是我既不是专业的心理学家,也不是统计学家,而且我很..._软件项目进度未完成原因分析怎么写

java unicode 转换_java中Unicode码的转换-程序员宅基地

展开全部private static String decode(char[] in) throws Exception {int off = 0;char c;char[] out = new char[in.length];int outLen = 0;while (off < in.length) {c = in[off++];if (c == '\\') {if (in.length..._unicode码如何转换java

街头篮球 服务器中断,win7系统下玩街头篮球卡机如何解决-程序员宅基地

街头篮球是一款备受用户们喜欢的游戏,然而在玩的过程中,有不少win7系统用户发现街头篮球卡机了,影响了游戏体验,该怎么办呢,本文就给大家讲解一下win7系统下玩街头篮球卡机的具体解决方法。1、游戏卡机的原因是有很多种的,比如:电脑配置不好,网络不好,程序开启太多,游戏服务器,电脑温度高等;2、就电脑配置方面来说,很多玩家使用的电脑配置都很好,不过有一小部分电脑配置时间太长,已经跟不上游戏的需求;3...

Linux如何查看CPU温度_linux 查看温度-程序员宅基地

作为爱机的主人,咱们得嘘寒问暖是不是?下面介绍Linux下查看CPU温度的方法.CentOS系列: 1.yum install lm_sensors;2.sensors-detect3.sensorsUbuntu系列:1.apt-get install lm-sensors2.sensors-detect3.service kmod start4.sensors注意:这些命令执_linux 查看温度

STM32物联网项目-窗口看门狗WWDG_stm32 hal wwdg喂狗_ONE_Day|的博客-程序员宅基地

储存在WWDG_CR寄存器中的数值必须在 0xFF 和 0xC0 之间,这个范围在开头链接的文章里有讲,就是要确保第7位和第6位都为1,第7位是使能窗口看门狗,第6位是窗口看门狗复位标志,剩下的第5 ~ 第0共6位,才是可以变化的计数值。因为CubeMX这次配置的参数是十进制(其实也能配置为十六进制,但是十进制更清晰点),根据上面两张图就可得知,窗口值是要设置在最大计数值和最小计数值之间的,因为计数值到达63时已经产生复位,所以窗口值要设置在127到64之间,这里配置为100,可根据实际情况来配置;_stm32 hal wwdg喂狗