错误:使用&&操作符时使用但未定义的标签

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

Linux上使用gcc进行编译时,出现错误

 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”下面的macros定义。 它没有说label任何内容,但是评论说,它可以返回“ program counter

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

Solutions Collecting From Web of "错误:使用&&操作符时使用但未定义的标签"

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

这里&&是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中的标签只能放在语句之前,而不能放在声明之前。

&使用两种方法,首先,你可以得到一个变量的地址:

 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; } ... }