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;})
答案 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;
}
...
}