你可以使用一元操作符&&得到在当前函数(或包含函数)中定义的标签的地址.得到的值的类型是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 ]);
这种方式在编写共享库中代码的时候显得更为友好,因为它减少了必须的动态地址重定位的次数从而运行这些(地址)值是只读的。

转载于:https://blog.51cto.com/nathanxu/56661

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

  1. gcc对C语言的扩展:局部标签声明(Locally Declared Labels)

    每个语句内嵌表达式都是一个可以声明局部跳转标签的域.一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做. 一个局部标签的申明如下: __label__ la ...

  2. gcc对C语言的扩展:语句内嵌表达式(statement-embedded expression)

    在gnu c 中,用括号将复合语句括起来也形成了表达式.他允许你在一个表达式内使用循环,跳转和局部变量. 一个复合语句是用大括号{}括起来的一组语句.在包含语句的表达式这种结构中,再用括号( )将大括 ...

  3. (转)C语言家族扩展

    (转)C语言家族扩展 翻译: 5.1--5.6 林峰 5.7--5.20 董溥 5.21--5.26 王聪 5.27--5.34 刘洋 5.35--5.43 贾孟树 致谢:感谢陈老师指出其中的一些错误 ...

  4. GNU C 对标准C语言的扩展(转载 懵懵懂懂)

    GNU C 对标准C语言的扩展 为了方便使用,GNU C在标准C语言的基础上进行了部分方便开发的扩展.这里讲解一些开发中可能会用到的,或者使用频率比较高的内容. 1 零长度数组和变量长度数组 GNU ...

  5. 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )

    文章目录 一.Groovy 支持 Java 语法 二.Groovy 支持 Java 虚拟机 三.Groovy 语言是 动态语言 四.Groovy 扩展 JDK 五.Groovy 编译时元编程 一.Gr ...

  6. linux c语言编程内嵌汇编,gcc编译c语言中内嵌汇编

    gcc编译c语言中内嵌汇编 --AT&T and Intel 汇编语法对照 寄存器命名: AT&T:  %eax Intel: eax AT&T 语法源地址在左侧,目的地址在右 ...

  7. PL/0语言编译器扩展 编译原理课程实践(1)

    转眼大学生活就要结束,编译原理课程学的东西很多都忘记了.当时我们编译原理课程实践是PL/0语言编译器扩展,在原有PL/0语言文法进行扩展.我写这次博文一是为了回忆以前学的知识,加深记忆:二是和大家分享 ...

  8. GCC 编译 C 语言文件

    GCC 编译 C 语言文件 题目要求 请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b) ...

  9. 【C】C语言函数中的变量(包括:作用域、存储类型)

    局部变量和全局变量 C语言中变量按其作用域分,可分为局部变量和全局变量,具体的解释为: 局部变量(内部变量):在定义它的函数内有效,但是函数返回后失效: 全局变量(外部变量):在所有源文件内均有效.在 ...

  10. 单片机c51语言变量,单片机c语言教程:C51变量

    上课所提到变量就是一种在程序执行过程中其值能不断变化的量.要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间.定义一个变量的格式如下: ...

最新文章

  1. oracle19c怎么创建Scott,Oracle db-sample-schema-19c安装(scott hr oe pm ix sh bi用户创建部署)...
  2. Android进程使用Messenger通信
  3. 科大讯飞2021笔试题
  4. 允许匿名用户访问VisualSVN
  5. JAVA中如何交换两个List集合的顺序呢?
  6. Spring的AOP面向切面编程
  7. 物联网能为企业做点什么?
  8. C语言随机生成26个字母,菜鸟求助,写一个随机输出26个英文字母的程序
  9. 用HashAlgorithm來加强數據的保險程度。
  10. 大学计算机ppt制作步骤,PPT制作教程步骤方法_PPT制作技巧教程快捷键_PPT制作基础教程...
  11. aix服务器文件名乱码,java aix 文件名乱码
  12. 智能优化算法:人工水母搜索算法 -附代码
  13. 利用js脚本自动批量删除微博内容
  14. 解决 adb no permissions (user mi is not in the plugdev group);
  15. 东北大学计算机学院教授,东北大学之计算机系
  16. 使用HBuilder制作一个简单的HTML5动漫网页——紫罗兰永恒花园动漫价绍网页 7页
  17. vue中click无效问题
  18. 我让我 9 岁的女儿利用 ChatGPT 来学习数学
  19. 索引的作用和为什么要创建索引
  20. 贴片电容COG、NPO 、X7R、X5R、Y5V介质区别

热门文章

  1. mysql简单的数据提取代码_MYSQL提取非常简单的数据,chrome浏览器响应过长,如何优化?...
  2. MAC:使用install_name_rpath修改编译结果的rpath
  3. TeaVM当前版本(0.7.0)还不支持传递字串参数
  4. 说说自动学习,是什么样的境界和体验
  5. 使用TortoiseGit提交代码到github上
  6. 回答工作做好了,可能有三种情形
  7. gstreamer/deepstream崩溃记录及分析
  8. 用remastersys备份LINUX,注意备份盘的空间占用
  9. C中处理Python的Numpy数组的代码范例
  10. c++ 11 新特性之 左值右值