823032003 发表于 2010-11-14 12:42:12

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

__LINE__:记录文件已经被编译的行数

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

这个宏什么意思?=谢谢
./emotion/em064.gif./emotion/em064.gif./emotion/em064.gif
./emotion/em064.gif./emotion/em064.gif./emotion/em064.gif

yrloy 发表于 2010-11-14 14:02:39

是Protothreads中的Swich方案的代码

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

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

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

823032003 发表于 2010-11-14 16:36:52

回复【1楼】yrloy 断雪
是protothreads中的swich方案的代码
__line__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
-----------------------------------------------------------------------

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

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

uipp 发表于 2010-11-14 16:45:08

光看这一句当然不容易看明白了,结合上下文

823032003 发表于 2010-11-14 17:58:52

回复【1楼】yrloy 断雪
是protothreads中的swich方案的代码
__line__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
-----------------------------------------------------------------------

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

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

程序中试如何跳转的

dr2001 发表于 2010-11-14 18:34:51

注意以下内容:
1、宏展开后,无论多长,是展开到一行上的,这是能用的前提。
2、__LINE__是编译器内置的宏,展开后是一个数值,值为当前行行号。

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

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

823032003 发表于 2010-11-15 18:06:48

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

非常感谢

823032003 发表于 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__);

什么意思啊?谢谢大侠

823032003 发表于 2010-11-16 14:26:34

回复【7楼】823032003 尼美根
-----------------------------------------------------------------------

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

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

theophilus 发表于 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

823032003 发表于 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看成一个字符串就可以是把

eddia2012 发表于 2012-11-21 12:02:57

是Protothreads中的Swich方案的代码

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

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

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

jz701209李 发表于 2013-4-8 20:57:26

学习一下....

yufanyufan77 发表于 2014-9-25 22:37:57

也解决了我的疑问,谢谢……
页: [1]
查看完整版本: 请教:Protothreads #define LC_SET(s) s = __LINE__; case __LINE__: 什么意思