为什么gcc使用&&一元运算符而不是直接给出标签的地址?

时间:2015-10-09 01:22:46

标签: c gcc unary-operator

我怀疑为什么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

}

1 个答案:

答案 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];