搜索
bottom↓
回复: 13

请教:Protothreads #define LC_SET(s) s = __LINE__; case __LINE__: 什么意思

[复制链接]

出0入0汤圆

发表于 2010-11-14 12:42:12 | 显示全部楼层 |阅读模式
__LINE__:记录文件已经被编译的行数

#define LC_SET(s) s = __LINE__; case __LINE__:  

这个宏什么意思?=谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-11-14 14:02:39 | 显示全部楼层
是Protothreads中的Swich方案的代码

__LINE__是编译器自带的宏,意思是当前的行号。

这句是记录当前行号,并为下次执行到这个任务做好标记。

等下次执行时,直接跳到case这个位置

出0入0汤圆

 楼主| 发表于 2010-11-14 16:36:52 | 显示全部楼层
回复【1楼】yrloy 断雪
是protothreads中的swich方案的代码
__line__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
-----------------------------------------------------------------------

“下次执行时,直接跳到case这个位置” 怎么跳到的呀?

我刚接触这玩意,大侠多多指点,谢谢

出0入0汤圆

发表于 2010-11-14 16:45:08 | 显示全部楼层
光看这一句当然不容易看明白了,结合上下文

出0入0汤圆

 楼主| 发表于 2010-11-14 17:58:52 | 显示全部楼层
回复【1楼】yrloy 断雪
是protothreads中的swich方案的代码
__line__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
-----------------------------------------------------------------------

编译器编译的时候是行号,

可是程序执行的时候并没有行号这个概念啊。

程序中试如何跳转的

出0入0汤圆

发表于 2010-11-14 18:34:51 | 显示全部楼层
注意以下内容:
1、宏展开后,无论多长,是展开到一行上的,这是能用的前提。
2、__LINE__是编译器内置的宏,展开后是一个数值,值为当前行行号。

故,如果该宏使用在第100行,那么展开后为:
s = 100; case 100:
如果s是整型变量,那么就可以跳转了。

如果两个这个宏写在同一行,会出错;
如果别的宏嵌套这个东西,要特别注意。

出0入0汤圆

 楼主| 发表于 2010-11-15 18:06:48 | 显示全部楼层
回复【5楼】dr2001
注意以下内容:
1、宏展开后,无论多长,是展开到一行上的,这是能用的前提。
2、__line__是编译器内置的宏,展开后是一个数值,值为当前行行号。
故,如果该宏使用在第100行,那么展开后为:
s = 100; case 100:
如果s是整型变量,那么就可以跳转了。
如果两个这个宏写在同一行,会出错;
如果别的宏嵌套这个东西,要特别注意。
-----------------------------------------------------------------------

非常感谢

出0入0汤圆

 楼主| 发表于 2010-11-16 14:10:29 | 显示全部楼层
回复【6楼】823032003 尼美根
回复【5楼】dr2001  
注意以下内容:  
1、宏展开后,无论多长,是展开到一行上的,这是能用的前提。  
2、__line__是编译器内置的宏,展开后是一个数值,值为当前行行号。  
故,如果该宏使用在第100行,那么展开后为:  
s = 100; case 100:  
如果s是整型变量,那么就可以跳转了。  
如果两个这个宏写在同一行,会出错;  
如果别的宏嵌套这个东西,要特别注意。
-----------------------------------------------------------------------
非常感谢
-----------------------------------------------------------------------

do {                                                \
    LC_CONCAT(LC_LABEL, __LINE__):                   \
    (s) = &&LC_CONCAT(LC_LABEL, __LINE__);        \
  } while(0)

(s) = &&LC_CONCAT(LC_LABEL, __LINE__);

什么意思啊?谢谢大侠

出0入0汤圆

 楼主| 发表于 2010-11-16 14:26:34 | 显示全部楼层
回复【7楼】823032003 尼美根
-----------------------------------------------------------------------

(s) = &&LC_CONCAT(LC_LABEL, __LINE__);

LC_LABEL 是哪里来的变量,protothread真是困难那

出0入0汤圆

发表于 2010-11-16 15:24:49 | 显示全部楼层
那个是GCC编译器扩展的addressable labels, Realview armcc好像也支持,其它编译器的不要管,不支持的。
http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
http://www.keil.com/support/man/docs/armccref/armccref_ch03s07s12.htm


LC_LABEL是个宏,定义为
#define LC_CONCAT2(s1, s2) s1##s2
#define LC_CONCAT(s1, s2) LC_CONCAT2(s1, s2)
进行的是Token concatenation

比如:
LC_CONCAT(LC_LABEL, __LINE__);
就是比如当前行数是1234
合并成
LC_LABEL1234

出0入0汤圆

 楼主| 发表于 2010-11-16 18:26:34 | 显示全部楼层
回复【9楼】theophilus
那个是gcc编译器扩展的addressable labels, realview armcc好像也支持,其它编译器的不要管,不支持的。
http://gcc.gnu.org/onlinedocs/gcc/labels-as-values.html
http://www.keil.com/support/man/docs/armccref/armccref_ch03s07s12.htm
lc_label是个宏,定义为
#define lc_concat2(s1, s2) s1##s2
#define lc_concat(s1, s2) lc_concat2(s1, s2)
进行的是token concatenation
比如:
lc_concat(lc_label, __line__);
就是比如当前行数是1234
合并成
lc_label1234

-----------------------------------------------------------------------

谢谢了,那可以吧 LC_LABEL看成一个字符串就可以是把

出0入0汤圆

发表于 2012-11-21 12:02:57 | 显示全部楼层
是Protothreads中的Swich方案的代码

__LINE__是编译器自带的宏,意思是当前的行号。

这句是记录当前行号,并为下次执行到这个任务做好标记。

等下次执行时,直接跳到case这个位置
//-------------------------------------------------------------------------------
经典

出0入0汤圆

发表于 2013-4-8 20:57:26 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2014-9-25 22:37:57 | 显示全部楼层
也解决了我的疑问,谢谢……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 09:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表