请教: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 是Protothreads中的Swich方案的代码
__LINE__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置 回复【1楼】yrloy 断雪
是protothreads中的swich方案的代码
__line__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
-----------------------------------------------------------------------
“下次执行时,直接跳到case这个位置” 怎么跳到的呀?
我刚接触这玩意,大侠多多指点,谢谢 光看这一句当然不容易看明白了,结合上下文 回复【1楼】yrloy 断雪
是protothreads中的swich方案的代码
__line__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
-----------------------------------------------------------------------
编译器编译的时候是行号,
可是程序执行的时候并没有行号这个概念啊。
程序中试如何跳转的 注意以下内容:
1、宏展开后,无论多长,是展开到一行上的,这是能用的前提。
2、__LINE__是编译器内置的宏,展开后是一个数值,值为当前行行号。
故,如果该宏使用在第100行,那么展开后为:
s = 100; case 100:
如果s是整型变量,那么就可以跳转了。
如果两个这个宏写在同一行,会出错;
如果别的宏嵌套这个东西,要特别注意。 回复【5楼】dr2001
注意以下内容:
1、宏展开后,无论多长,是展开到一行上的,这是能用的前提。
2、__line__是编译器内置的宏,展开后是一个数值,值为当前行行号。
故,如果该宏使用在第100行,那么展开后为:
s = 100; case 100:
如果s是整型变量,那么就可以跳转了。
如果两个这个宏写在同一行,会出错;
如果别的宏嵌套这个东西,要特别注意。
-----------------------------------------------------------------------
非常感谢 回复【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__);
什么意思啊?谢谢大侠 回复【7楼】823032003 尼美根
-----------------------------------------------------------------------
(s) = &&LC_CONCAT(LC_LABEL, __LINE__);
LC_LABEL 是哪里来的变量,protothread真是困难那 那个是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 回复【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看成一个字符串就可以是把 是Protothreads中的Swich方案的代码
__LINE__是编译器自带的宏,意思是当前的行号。
这句是记录当前行号,并为下次执行到这个任务做好标记。
等下次执行时,直接跳到case这个位置
//-------------------------------------------------------------------------------
经典 学习一下.... 也解决了我的疑问,谢谢……
页:
[1]