C 函数调用的标签地址是否相同

C 函数调用的标签地址是否相同,c,gcc,goto,C,Gcc,Goto,当我使用GCCs标签作为值扩展存储标签的地址时,它们在不同的深度调用中是否相同 void *label = NULL; int test() { if (label == NULL) { label = &&label_l; } else { goto *label; } return(test() + 1); label_l: return(0); } 即使标签被设置在不同的堆栈框架中,这是否有效 在不同的深度通话中,它们

当我使用GCCs标签作为值扩展存储标签的地址时,它们在不同的深度调用中是否相同

void *label = NULL;

int test() {
  if (label == NULL) {
    label = &&label_l;
  } else {
    goto *label;
  }
  
  return(test() + 1);
  
  label_l:
  return(0);
}
即使标签被设置在不同的堆栈框架中,这是否有效

在不同的深度通话中,它们是否相同

void *label = NULL;

int test() {
  if (label == NULL) {
    label = &&label_l;
  } else {
    goto *label;
  }
  
  return(test() + 1);
  
  label_l:
  return(0);
}
一般来说,是的。发件人:

如果包含函数是内联的或克隆的,则同一标签的&&foo表达式可能具有不同的值。如果程序依赖于它们总是相同的,则应使用
\uuuuu attribute\uuuuuuu((\uuuuuu noinline\uuuuu,\uuuuuu noclone\uuuu))
来防止内联和克隆。如果在静态变量初始值设定项中使用&&foo,则禁止内联和克隆

在您的程序中,它不在静态变量初始值设定项中使用,因此您的函数可能会内联或重复,并且标签将跳转到不同的函数-确保不会发生这种情况。(但即使您要执行
static void*label=&&label\u l
,我仍然会添加
\u属性(noinline\u,\u noclone\u))
,以防止以后的重构)

一个真实的例子:可以用来存储要跳转到的case语句

总之,不要将标签用作值。如果您打算使用它,则更倾向于仅对自动局部变量使用它。您呈现的代码看起来像是对无法维护的意大利面条代码的邀请

即使标签设置在不同的堆栈框架中


是的,堆栈帧并不重要。我们生活在这个世界上,所以内存中的内容是独立的,代码位置不会改变。

此代码不会编译。邮政工作代码。再努力一点。一旦你修复了代码中的错误(
label\l
实际上不是一个标签),这是一个非常有趣的问题。。。指向标签的指针在多次调用中是否保持不变?我会说是的,因为函数在加载后不会在内存中移动。
void*
与任何数据指针兼容。标签不是数据对象。背后有什么真正的问题吗?说了这么多,你为什么要这样做?这应该解决的真正根本问题是什么?如果只是单纯的好奇,那没关系,但请你把问题说出来。否则,请直接询问您的实际问题(否则这是一个问题)。
即使标签设置在不同的堆栈帧中?
您所说的“不同堆栈帧”是什么意思?