阅 读 文 章

gcc对C语言的扩展:标签变量(Labels as Values)

[来源:网上转载 (http://www.chinaunix.net) | 作者:网友(不详) | 时间:2007-07-07 | 浏览:人次 ]

你可以使用一元操作符&&得到在当前函数(或包含函数)中定义的标签的地址.得到的值的类型是void*。这个值是一个常量,可以在任何使用这个类型的常量的地方使用。例如:
void *ptr;
...
ptr = &&foo;
这个变量可用于跳转到某个位置--例如使用goto语句 go *exp. 例如:
goto *ptr;
在这里 任何void *类型的表达式都是合法的。标签常量的一种用法是用于初始化一个静态数组,他能够被当作跳转表。
static void *array[] = { &&foo, &&bar, &&hack };
这样你就可以通过索引来选择一个标签,如:
goto *array[ i ];
注意这句语句中没有检查下标是否越界--在C语言中数组下标从来不会检查是否越界
这里的标签数组的使用目的和switch语句十分类似。switch语句的表达要比标签数组更为清晰,所以除非遇到switch语句实在无法适用的场合再考虑使用标签数组。
标签量的另外一种用法是用在线程代码的解释器程序(interpreter)中。解释器函数中的标签可以被存储到线程代码中来获得极高的线程切换效率。
你可能不能使用这种机制来跳到另一个函数中的代码中,如果你这么做的了,结果完全不可预料。避免这种情况最好的办法就是只将标签地址存储在automatic变量中并且永远不要把它作为参数传递。上面的例子的另外一种写法是:
static const int array[] = { &&foo - &&foo,&&bar - &&foo,&&hack - &&foo };
goto *(&&foo + array[ i ]);
这种方式在编写共享库中代码的时候显得更为友好,因为它减少了必须的动态地址重定位的次数从而运行这些(地址)值是只读的。
论坛热门帖子: [lch203] 写得蛮好的linux学习笔记(10-21)
[黑马制造] 学习java的30个目标(10-19)
[笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19)
[udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18)
[沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18)
TAG标签: 变量 标签 语言 扩展 foo 使用 语句 地址 void 代码 goto

最新评论 共有0位网友发表了评论

发表评论

评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名:(注册)
密码:
验证码:
匿名发表

网站地图友情连接交流论坛网站投稿广告服务联系我们留言本站长统计
Some rights reserved: www.chmhome.com, 鄂ICP备07010232号 E-mail:chinakafei@live.com,QQ:552766
中国咖啡技术网(Chmhome):国外编程技术书籍,中文编程手册,经典编程文章,交流技术,技术软件下载,计算机论文,毕业论文.