错误:使用&&时标记已使用但未定义操作者

时间:2012-12-17 13:29:52

标签: c++ c linux gcc operator-overloading

int main()
{
        int i = 0;
        int *p = &i;
        int *q = &&i;
        return 0;
}

使用gcc上的Linux进行编译时,我收到错误

addr.c: In function ‘main’:
addr.c:6:2: error: label ‘i’ used but not defined

为什么编译器将int i视为label而不是整数?我们何时使用&& operator

编辑:好的,我可以在某种程度上理解答案,但是你可以从“arch / arm / include / asm / processor.h”解释下面的宏定义。它没有说明label的任何内容,但评论说,它可以返回“program counter

/*
 * Default implementation of macro that returns current
 * instruction pointer ("program counter").
 */
#define current_text_addr() ({ __label__ _l; _l: &&_l;})

3 个答案:

答案 0 :(得分:15)

什么&&运营商?没有一元&& C ++中的运算符。 GCC有一个允许computed goto语句的扩展名,该扩展程序使用&&获取标签的地址。

答案 1 :(得分:9)

这里&&是GNU C标签地址运算符。

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

int *q = &&i;

i必须是标签。您的计划中没有标签i

标签示例:

int main(void)
{
    i:
    (void) 0;

     int i = 0;
     int *p = &i;
     int *q = &&i;
     return 0;
}

我添加了(void) 0;语句,因为C中的标签只能放在语句之前,而不能放在声明之前。

答案 2 :(得分:4)

&有两种使用方式,首先,您可以获取变量的地址:

int *p = &i; // that's fine, p points to i's address

其次它用于做“按位”和:

int i = 1;     // 01
int j = 3;     // 11
int k = i & j; // 01

&&是一个逻辑运算符,而不是“运算符的地址”,它的用途是检查两个条件并断言两者都是真的。

if (something && something_else)

编辑:我刚注意到你把它作为C和C ++进行了测试......如果这是一个C问题,请参见上文。如果这是一个C ++问题,那么&&还有另一个注释:

C++ Double Address Operator? (&&)


编辑2:还有&&用作标签值运算符来获取标签的地址。

这是错误消息的内容,因为编译器假设您正在做的事情:

标签值运算符&&返回其操作数的地址,该操作数必须是当前函数或包含函数中定义的标签。该值是void *类型的常量,并且只能在计算的goto语句中使用。语言功能是C和C ++的扩展,用于移植用GNU C开发的程序。

int main()
{
   void * ptr1;
   label1: ...
   ptr1 = &&label1;

   ...

   if (...) {
      goto *ptr1;
   }
   ...
}