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

使用gccon编译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;})
4

3 回答 3

15

什么 && 运算符?C++ 中没有一元 && 运算符。GCC 有一个允许计算 goto语句的扩展,并且该扩展使用 && 来获取标签的地址。

于 2012-12-17T13:33:00.943 回答
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 中的标签只能放在语句之前,而不能放在声明之前。

于 2012-12-17T13:31:11.653 回答
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++ 双地址运算符?(&&)


编辑2:&&作为标签值运算符的另一种用途是获取标签的地址。

这就是错误消息的含义,因为编译器假设这是您想要做的:

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

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

   ...

   if (...) {
      goto *ptr1;
   }
   ...
}
于 2012-12-17T13:31:38.610 回答