我编写了一个程序,它接受一个输入字符并输出该字符,如下所示
int ch = getchar();
printf("%c", ch);
它像我预期的那样工作。然后我决定先欢迎并打印
Hello
。printf("Hello!\n");
int ch = getchar();
printf("%c", ch);
令我惊讶的是,这导致编译器抛出两个错误:
错误C2065:“ch”:未声明的标识符
错误C2143:语法错误:“type”之前缺少“;”
我不明白为什么加上第一行会导致这种情况发生。不管怎样,我重构了程序以去掉
int
声明,错误神奇地消失了。printf("Hello!\n");
printf("%c", getchar());
发生什么事?是什么魔力导致这些错误出现然后消失?
最佳答案
C89标准不允许在块开始后创建新变量,但在较新的C99标准中允许。
您正在使用较旧的编译器或不完全符合C99的编译器。
您的代码示例应该在任何好的编译器上都能正常工作。Works on gcc-4.3.4
替代解决方案:
您可以通过两种方式解决问题:
在块的开头声明变量:
int ch;
printf("Hello!\n");
ch = getchar();
printf("%c", ch);
或者
创建用于声明变量的新块:
printf("Hello!\n");
{
int ch = getchar();
printf("%c", ch);
}
建议:
您真的应该更改您的编译器,因为如果我记得正确的话,gcc甚至在c99之前就支持它作为编译器扩展。