尝试编译以下代码段时:
#include <stdio.h>
#include <time.h>
void change_a(int * a) {
*a = 1;
return;
}
void main(void) {
int a = 0;
change_a(&a);
if (a) {
time_t start = time(NULL);
}
/* do something that never mentions a */
if (a) {
time_t end = time(NULL);
printf("Time spent = %ld\n", (int) end - start);
}
}
GCC声明在
start
行中未定义printf
变量:$ gcc --version
gcc (Debian 4.8.2-1) 4.8.2
[SNIP]
$ gcc -o test.bin test.c
test.c: In function ‘main’:
test.c:24:44: error: ‘start’ undeclared (first use in this function)
printf("Time spent = %ld\n", (int) end - start);
另一方面,当将主函数更改为:
void main(void) {
int a = 0;
time_t start = 0;
change_a(&a);
if (a) {
start = time(NULL);
}
...
问题1
是我做错了什么,还是编译器做了一些我不知道的有趣的事情?
我想可能是编译器太聪明了,优化了那段代码,或者在启发式方面出了问题但每隔一次我“发现编译器错误”的时候,总是我遗漏了一些非常明显的错误。
所以我宁愿聪明人在指责其他聪明人不聪明之前先检查一下特别是当问题在没有优化的情况下发生时:
$ gcc -O0 -o test.bin test.c
test.c: In function ‘main’:
test.c:24:44: error: ‘start’ undeclared (first use in this function)
printf("Time spent = %ld\n", (int) end - start);
^
test.c:24:44: note: each undeclared identifier is reported only once for each function it appears in
问题2
我还想知道是否有更好的方法来避免编译器错误(如果不是最后一个代码片段中的解决方法)如果我的代码是错误的(因为响应将包括“正确的”代码),这是很明显的,但是我也想知道当有人修复GCC中的(所谓的)错误时如何避免错误。
最佳答案
在第一个示例中,start
变量在if
语句的范围内声明因此,变量超出了代码块末尾的范围(右大括号}
)。这绝对不是编译器错误。
你的“变通方法”是正确的解决方案。
See here用于更全面地描述变量范围如何在C/C++中工作(以及使用C样式范围的许多其他语言)。
关于c - 在IF语句中定义的 undefined variable 出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20531407/