本文由创新互联(www.cdcxhl.com)小编为大家整理,本文主要介绍了c语言在函数里能定义变量相关知识,希望对你有一定的参考价值和帮助,记得关注和收藏网址哦!
成都创新互联专注于堆龙德庆企业网站建设,成都响应式网站建设公司,商城网站建设。堆龙德庆网站建设公司,为堆龙德庆等地区提供建站服务。全流程按需开发,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务
让 让我们从这样一个结论开始:不是所有的函数宏定义都可以被普通函数方便地替代(请注意单词 "方便地 ").相信题主也知道这一点。
我上次的回答介绍了使用宏定义实现一套 "超时机制和对于C语言程序。这个机制不使用普通的函数,因为宏可以带来很大的便利。
可惜还在审核中(已经超过36小时)。避免 "笨重 "代码。然而,该 "超时 "C语言中的机制并不难实现。最后一个答案建立了一套非常简单的 "超时 "通过使用usleep()函数。既然还没批下来,相关的C语言代码就在这里再写一遍。请看:
上面的C语言代码会阻塞对就绪位的等待,但不会无限期等待,最多等待5000ms(即5秒)。这种处理虽然粗糙,但确实可以解决 "无限的等待 ",但是仅仅等待就绪位就需要编写三行代码。如果有很多地方可以做 "超时 "处理,整个C语言代码看起来很啰嗦。
如果你算上 "超时 "判断语句if(get_cur_ms()-otime = 5000),至少需要4行代码。
程序员小明想到把上面略显繁琐的 "超时 "c语言代码转换成函数。他认为:封装之后,如果你想使用 "超时 "函数,你只需要一行函数调用,所以他写了下面的C语言代码:
小明定义的cond_timeout()函数接收两个参数:cond参数表示等待的条件,timeout参数表示最大等待时间(单位为ms)。如果cond条件在超时期限内仍然无效,cond_timeout()函数返回1表示等待cond超时,否则返回0表示cond条件已成功等待。
在定义了cond_timeout()函数后,小明将在上一节中等待。 "超时 "就绪位的c语言代码:
修改为:
修改后的C语言代码确实更加简洁,但是好用吗?我们编译这段代码并执行:
奇怪,thread()的thread函数明明在2秒后就设置好了。为什么它仍然输出 "暂停 "?小明对此感到不解。
其实分析小明遇到的问题就像是脑筋急转弯。如果读者像小明一样困惑,那一定是因为他们没有 不要反应。cond_timeout()函数不执行的原因是:;t工作如小明所料很简单:cond参数只是cond_timeout()函数被调用时的状态,然后线程函数thread()无论如何修改ready都不会影响cont_timeout()函数中的cond。
以上 "超时 "c语言代码can 不要被封装。想用的时候只能一行一行写?当然,封装 "超时 "代码作为一种功能。它也可以封装为一个宏:
上面的C语言代码比较简单,一个值得说明的窍门是把{}放在()里,这样整个cond_timeout宏就相当于一个语句,这是Linux内核中相当常见的宏定义方法。
Cond_timeout宏__cond条件成立,或者等待__cond条件成立超过__timeout,就会达到(!(__cond))此时这一行:
很明显,如果此时cond成立,cond_timeout宏返回的0表示 "等待条件尚未超时否则,cond_timeout宏返回的1表示 "等待条件失败,超时。
现在将cond_timeout写入主函数,测试是否能正常工作。修改后的C语言代码如下,请看:
编译并执行这段C语言代码,得到如下结果:
因为thread()函数在2秒后设置就绪,所以cond_timeout宏没有返回超时。现在将thread()函数中的sleep(2)改为sleep(6)。相关的C语言代码如下。请看:
编译并执行修改后的C语言代码,得到如下结果:
一切都符合预期。
从这一节的总结可以看出,define宏定义有时候可以做函数做不到的事情。实际上,你可以理解定义宏定义只是暂时的包装和包装C语言代码。如果调用宏,编译器将展开包。所以,define宏定义实际上只是为几行代码取了一个名字。我们使用gcc -E命令获取经过编译器预处理的C语言代码:
# gcc -E t.c获得以下结果:
可以看出,define宏定义cond_timeout本身并不生成相关的预处理代码,而是编译器直接在被调用的地方展开宏代码,与函数不同。
欢迎在评论区一起讨论提问。文章都是手工原创,每天用最简单的介绍C语言、linux等嵌入式开发。如果你喜欢我的文章,就关注一下,可以看到最近的更新和之前的文章。
分享名称:c语言在函数里能定义变量吗?(函数名类型和形参类型要一致吗?)
标题URL:http://www.shufengxianlan.com/qtweb/news12/90512.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联