每个语句内嵌表达式都是一个可以声明局部跳转标签的域。一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做。
一个局部标签的申明如下:
__label__ label;
或者:
__label__ label1, label2, ...;
局部标签的申明必须在语句内嵌表达式的开始出,紧跟({后面,在所有通常申明的左边。局部标签申明只是定义了标签的名字,但是并没有定义标签本身。 你必须用通常的标签使用方法来在语句内嵌表达式内部使用局部标签。

由于语句内嵌表达式经常用于宏,所以局部标签特性非常有用。如果在宏里包含了循环,一个goto能很有效的跳出循环。然而通常的标签的作用域式整个函数,如果宏在一个函数中被多次使用,标签就会在这个函数中被重复定义。而局部标签能避免这个问题。例如:

#define search(array, target)               \
({                                 \
__label__ found;                     \
typeof (target) _search_target = (target);     \
typeof (*(array)) *_search_array = (array);   \
int i, j;                           \
int value;                         \
for (i = 0; i < max; i++)               \
  for (j = 0; j < max; j++)               \
    if (_search_array[j] == _search_target) \
    { value = i; goto found; }           \
value = -1;                         \
found:                             \
value;                             \
})

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

gcc对C语言的扩展:局部标签声明(Locally Declared Labels)相关推荐

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

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

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

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

  3. GCC 编译 C 语言文件

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

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

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

  5. 怎样用gcc编译c语言,使用GCC编译C语言程序

    使用Eclipse CDT开发C语言程序,虽然使用很方便,效率也很高,但是它向我们隐藏了很多细节.虽然大多数时候这并不影响我们的开发,但是当我们需要对程序的编译链接过程进行更加特殊的控制,以获得可以满 ...

  6. python是c语言写的_python使用C语言写扩展示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 ...

  7. linux怎么运行gcc,在Linux下使用gcc运行C语言程序

    标签:终端   工具   gcc   程序   分区   编译   mod   没有   保存 Linux下使用最广泛的C/C 编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是 ...

  8. Go 分布式学习利器(12)-- Go语言的扩展和复用

    Go语言无法天然支持继承,但是又想要实现面向对象的特性. 即父类对象 使用子类对象初始化,那么该父类对象调用的函数就是子类实现的函数 ,从而满足LSP(子类交换原则). 案例一: Go语言 支持扩展父 ...

  9. R语言ggplot2可视化删除所有分面图(facet_wrap可视化的facet结果)的标签实战(Remove facet_wrap labels)

    R语言ggplot2可视化删除所有分面图(facet_wrap可视化的facet结果)的标签实战(Remove facet_wrap labels) 目录

最新文章

  1. SQLServer 数据库变成单个用户后无法访问问题的解决方法
  2. Python Numpy中返回下标操作函数-节约时间的利器
  3. pci-e串口卡linux 驱动下载,万能PCI串口卡驱动下载
  4. DNS详解: A记录,子域名,CNAME别名,PTR,MX,TXT,SRV,TTL
  5. C++多态相关关问题及虚表剖析
  6. python安卓开发实例_python服务器与android客户端socket通信实例
  7. 如何使用Puppeteer从任何网站创建自定义API
  8. 后 5G 时代,路在何方?
  9. win10主机远程登录树莓派
  10. NXP RT1052 eFlexPWM—灵活的增强型 PWM
  11. 工程总承包(EPC)最高投标限价政策解说
  12. 明解C语言入门篇_第9章_字符串的基本知识
  13. (一)关于POE供电定义以及级别划分,如何测试网线是否满足相关标准?
  14. 大文件传输软件-镭速——MAC版分享
  15. matlab e52pt,帮我看看Matlab怎么改这个错误?
  16. Spring框架的起源
  17. 小米4c原版android哪个好,小米4c和小米4哪个好
  18. 《泰囧》票房奇迹:极简主义的胜利
  19. XSKY 文件存储首次进入 IDC 榜单
  20. 从零开发H5可视化搭建项目

热门文章

  1. (原创)对某国的一次渗透
  2. 【转载】恼人的函数指针(一)
  3. 3.寄存器(内存访问)
  4. System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
  5. 解决Warning: Cannot modify header information – headers already sent by
  6. [摘抄]MySQL数据库系统的常规管理介绍
  7. PowerDesigner12对SQL2005反向工程问题.
  8. java 中文字符和unicode编码值相互转化
  9. 【转】一篇比较清晰简单的C++文件操作
  10. acm常见算法及例题