【问题标题】:warning: taking the address of a label is non-standard [duplicate]警告:获取标签的地址是不标准的[重复]
【发布时间】:2014-09-11 23:32:48
【问题描述】:

谁能解释以下代码如何创建标签?

char memory[] = "hello";
&&memory[0];

error: label 'memory' used but not defined

【问题讨论】:

  • 你希望这段代码做什么?
  • 你肯定有一个& 太多了,不过我不知道标签的东西是从哪里来的。
  • @oli 取内存地址... if &memory[0] == memory.
  • @user4032914:memory 的地址只是memory - 它会衰减为指向第一个字符的指针。
  • 这是一个 GNU 扩展——或者,至少,标签的地址是一个 GNU 扩展,它们使用&& 表示法。请参阅 GCC 文档中的 Labels as values

标签: c++ g++ goto


【解决方案1】:
&&memory[0];

这不是有效的 C++,因此符合标准的扩展可以为其分配任何想要的语义。

碰巧&&label 是 GNU 人获取计算 goto 的标签地址的方式,这是一个 GNU 扩展。

就是这样。

参考:https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

【讨论】:

  • 表达式对 GNU 编译器的全部含义是,首先(未定义的)标签 memory 被解析为地址 (of type void *),然后该指针通过 [0] 部分下标,这恰好也是一个无效的操作。 (您可能希望在答案中包含该链接。)
  • 嗯,当然,他们也有在void* 上允许指针算术的令人讨厌的扩展(我认为这不是 C++ 的符合扩展)。
  • 糟糕,[] 实际上似乎比&& 绑定得更紧密,(&&label)[0] 崩溃 GCC 4.9.0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2016-12-23
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多