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

简介:
你可以使用一元操作符&&得到在当前函数(或包含函数)中定义的标签的地址.得到的值的类型是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 ]);

这种方式在编写共享库中代码的时候显得更为友好,因为它减少了必须的动态地址重定位的次数从而运行这些(地址)值是只读的。




     本文转自nathanxu 51CTO博客,原文链接:http://blog.51cto.com/nathanxu/56661,如需转载请自行联系原作者



相关文章
|
4月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
138 1
|
4月前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
2月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
47 1
|
2月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
2月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
2月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
2月前
|
编译器 C语言
初识C语言:扩展世界观,选择语句之行
初识C语言:扩展世界观,选择语句之行
|
2月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
3月前
|
存储 C语言
【C语言基础考研向】02 数据类型-常量-变量
本文介绍了编程中的基本概念,包括数据类型分类、常量与变量的定义及使用。首先概述了四大类数据类型:基本类型(整型、浮点、字符型)、构造类型(数组、结构体)、指针类型和空类型。接着阐述了常量与变量的区别及命名规则,并详细说明了整型、浮点型和字符型数据的特点与应用。最后总结了常见的易错点,如字符串与字符常量的区别及浮点数的默认输出格式。
|
3月前
|
存储 传感器 物联网
结合物联网开发探讨C语言的变量
在物联网(IoT)开发中,C语言的变量起着至关重要的作用。由于物联网设备资源有限,C语言的高效性和对硬件的直接控制使其成为开发嵌入式系统的首选。