【问题标题】:why does gcc uses && unary operator instead of giving direct address of a label?为什么 gcc 使用 && 一元运算符而不是给出标签的直接地址?
【发布时间】:2015-10-09 01:22:45
【问题描述】:

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

}

【问题讨论】:

  • 您可能会在这里找到答案:stackoverflow.com/questions/1777990/… TL;DR 可能是:因为 C 和 C++ 标准不支持获取标签的地址。
  • 哦,哇,我什至不知道 gcc 可以做到这一点。据我所知,MSVC 不支持这一点——并不是说我真的用过 goto 很多,但现在仍然很高兴知道!
  • @Blindy :如果在 32 位代码(不是 x64)中使用 MSVC,您可以使用内联汇编访问标签的地址。 void* loc; __asm{ mov [loc],offset locA }; locA:
  • 我必须同意@Olaf 的观点——如果您必须使用不符合标准的方式来做某事,您最好重新编写代码以找到符合标准的实现方式同一个目标。

标签: c gcc unary-operator


【解决方案1】:

这是一个 gcc 扩展,在 Labels as Values 部分中作为文档 Extensions to the C Language Family of the gcc documentation 表示:

您可以获取当前函数中定义的标签的地址(或 一个包含函数)与一元运算符'&&'。值有 键入无效 *。这个值是一个常数,可以在任何地方使用 该类型的常量是有效的。例如:

 void *ptr;
 /* ... */
 ptr = &&foo;

要使用这些值,您需要能够跳转到一个。这个做完了 使用计算的 goto 语句 1,goto *exp;。例如,

 goto *ptr;

使用这些常量的一种方法是初始化一个静态数组 用作跳转表:

 static void *array[] = { &&foo, &&bar, &&hack };

然后你可以选择一个带有索引的标签,像这样:

 goto *array[i];

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多