在查阅linux内核源码的过程中,发现存在两种不同类型的条件编译语句:#ifdef MACRO_A和#if defined(MACRO_A)或#if !defined(MACRO_A)
实际上,两者并无本质的差别,但后者的应用范围更广,能支持多个预编译变量的检查。
#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后面需要是一个表达式,如果表达式为1则调用#if下面的代码。
对于#ifdef后面需要的只是这个值有没有用#define定义,并不关心define的这个值是0还是1。
要使得判别条件#ifdef结果为假,也就是不执行判别条件后面所跟的语句,需要对#ifdef后面所跟的宏使用#undef语句进行声明。
教程网站:https://git-scm.com/book/zh/v2/ *windows下的powershell命令行工具据说很强大*https://help.github.com/articles/connecting-to-github-with-ssh/ [如何关联github和自己的本地主机]执行ssh-add时出现Could not open ...
整理完了一对多的关联关系,下面咱们来看看一对一的关联配置情况,重点还是在于分清楚关系维护方和关系被维护方,然后在具体操作,在个就是cascade=CascadeType的维护方式,没必要的级联尽量不要,否则会造成不必要的结果。在一对一中的例子中,我们分析人和身份证号的关系,一个人只能有一个身份证号,而且伴随着人死亡而失效,至于人是否出生就有身份证号我们不深究,这里理解为不是,无关影响。那具体操
题库来源:安全生产模拟考试一点通公众号小程序2022汽车驾驶员(高级)考试题目系汽车驾驶员(高级)复审题库高频考题覆盖!2022年汽车驾驶员(高级)试题及在线模拟考试依据汽车驾驶员(高级)最新教材汇编。汽车驾驶员(高级)考试资料随时根据安全生产模拟考试一点通准确把握考试要点。1、【单选题】()不是万向传动装置抖动的原因。( D )A、传动轴动不平衡B、万向节十字轴装配过紧,转动不良C、中间支撑轴承支架安装偏斜,轴承调整不当D、中间支撑轴承支架散离,轴承滚道磨损2、【单选题】()是气压制动系_某项目为了赶工期,建设单位要求施工单位压缩2个月合同工期,工地施工人员根
正常操作,正常分析,大家好,我是D1n910。文章关键词: 技术 前端JQuery 入门 滚动文章前言:公司要求做官网呀呀呀,其中有一部分设计是要求我们最亲爱的品牌商的LOGO能够在底部无缝轮播,鼠标移上去就停下来。效果如下:一、使用插件介绍1、使用的框架是JQuery,因为讲究快速、兼容、展示,所以没有用vue、react之类的看起来高大上的框架。2、使用的是优秀的轮播插件Swiper3.0版..._jq swiper移入移除
#swagger2介绍Swagger Codegen: 通过Codegen 可以将描述文件生成html格式和cwiki形式的接口文档,同时也能生成多钟语言的服务端和客户端的代码。支持通过jar包,docker,node等方式在本地化执行生成。也可以在后面的Swagger Editor中在线生成。Swagger UI:提供了一个可视化的UI页面展示描述文件。接口的调用方、测试、项目经理等都可..._swagger通过codegen可以将描述文件生成html格式和cwiki形式的接口文档
使用Java代码可以动态添加 并设置所有组件属性。(需要LayoutParams.addRule方法来设置属性,然后调用View.setLayoutParams方法更新View)示例:(动态添加Button)//装载布局文件,需要动态添加一个ButtonRelativeLayout relativelayout=(RelativeLayout)getLayoutInflater().in_android java include动态添加
DHCP,NAT和静态路由综合实验 目标1、PC0自动从DHCP服务器获得192.168.10.100的地址,PC1自动从DHCP服务器获得1.1.1.100的地址(需要在Router0上配置中继代理),PC2自动从soho路由器上获得192.168.1.100的地址,所有DHCP服务的地址数量均为100个。所有主机自动获得的掩码、网关和DNS服务器地址等其他信息请自行判断。2、其他IP地址按照拓扑图上的配置静态配置好。3、配置路由器的静态路由和soho路由器的静态静态映射(静态映射命名为myhtt._pkt dhcp、静态nat和动态nat
https://123.157.208.21:50001/portal/ui/data-view?key=ba9c7c10bf964136a4d31feb7d1596da_映射端口后页面图片无法显示
问题描述:在主线中开了一个子线程,并且子线程和主线程共享一个串口实例。我就让子线程向串口发送数据,结果就报错:serial.serialutil.SerialException: ClearCommError failed (OSError(9, '句柄无效。', None, 6))原因:主线程开启子线程后,就接着往下执行,此时主线程和子线程处于并行状态。而我在主线程中有一个关闭串口实例的操作,子线程有使用串口实例的操作。如果主线程先关闭串口实例,子线程后使用串口实例,就会导致这样的错误。解决办法:
很多人都喜欢用iPhone手机,上面有很多好用的功能,不得不承认,iPhone手机这9个实用功能,确实比安卓好用,下面一起来看看吧。_iphone功能
如果一张车票,被A乘客选中,且停留在付款页面,那么这张车票是不能出现在其他购票用户是不能购买的,因为该车票已经暂时被锁定,那么假如A乘客迟迟停留在付款页面,20秒钟过后,还未支付该订单,那么系统的定时器的功能会执行调度器去查询支付状态,如果未支付,我们的定时器工作要实现此功能,将车票解除锁定,重新改为可用的状态,那么A用户和其他的用户又能够购买该票。这时候就需要quartz自动调度器来实现。本项..._quartz jobname group
原题:力扣链接:594. 最长和谐子序列题目简述:和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。解题思路1.哈希计数;2.然后计算差值为1的两个数的次数和;3.over;C++代码:class Solution {public: int findLHS(vect