test.c
#include <stdio.h>
int main(void)
{
int a = 13;
const int **pp = &&a;
return 0;
}
看上面的代码。
我知道这是不对的。
但是,我的问题是关于我不理解的错误消息。
我认为错误消息将包含诸如“需要左值一元操作数”之类的东西。
在 cc -std = c11 test.c 之后,我得到了:
test.c: In function ‘main’:
test.c:7:2: error: label ‘a’ used but not defined
const int **pp = &&a;
我认为 a 应该被称为变量或标识符,它们已经使用 int a = 13进行了定义;
错误编译后,C编程语言错误消息中的标签是什么?
答案 0 :(得分:3)
您偶然发现了名为Labels As Values的非标准GCC功能。
将代码更改为以下内容,然后看看会发生什么。
#include <stdio.h>
int main(void)
{
int a = 13;
void *pp = &&a;
goto *pp;
return 0;
a:
printf("ooooops\n");
return 0;
}
从本质上讲,这是一种将goto
标签用作值的方法,即可以将标签分配给void *
指针,然后在goto
语句中使用该指针。 / p>
这不是标准C,以确保您不会使用任何将-std
设置为-std=c99
的非标准功能,也不要使用您想要使用的任何标准。