手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
您能够使用一元操作符&&得到在当前函数(或包含函数)中定义的标签的地址.得到的值的类型是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 ]);
这种方式在编写共享库中代码的时候显得更为友好,因为他减少了必须的动态地址重定位的次数从而运行这些(地址)值是只读的。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!