我怀疑为什么gcc使用&&
来访问标签以及为什么它不能直接访问与标签关联的位置值。比如下面的一段代码:
void main()
{
static void* loc = &&locA;
printf("locA : %p\n", locA); //will give error
printf("loc : %p\n",loc); //will not give error
//statments X
locA :
//statements Y
}
答案 0 :(得分:2)
这是Extensions to the C Language Family of the gcc documentation部分中的文档Labels as Values的gcc扩展名,其中包含:
您可以获取当前函数中定义的标签的地址(或 包含函数)和一元运算符'&&'。价值有 输入void *。该值是常量,可以在任何地方使用 该类型的常量有效。例如:
void *ptr; /* ... */ ptr = &&foo;
要使用这些值,您需要能够跳转到一个。这个完成了 使用计算的goto语句1,goto * exp;。例如,
goto *ptr;
使用这些常量的一种方法是初始化静态数组 作为跳转表:
static void *array[] = { &&foo, &&bar, &&hack };
然后您可以选择带索引的标签,如下所示:
goto *array[i];