我正在尝试编译一个程序(清单12.13 - 来自Stephen Prata的C Primer Plus第6版的manydice.c)但是我收到了编译错误:'status'未声明(首次使用此函数)。
我还要感谢有关“宣布任何地方”的c99标准的澄清。
以下是代码的一部分:
int main(void)
{
int dice, roll;
int sides;
srand((unsigned int) time(0)); /* randomize seed */
printf("Enter the number of sides per die, 0 to stop.\n");
while(scanf("%d", &sides) == 1 && sides > 0)
{
printf("How many dice?\n");
if((status = scanf("%d", &dice)) != 1)
{
if(status == EOF)
{
break; /* exit loop */
}
...
错误消息是:
||=== Build: Debug in dice (compiler: GNU GCC Compiler) ===|
~manydice.c||In function 'main':|
~manydice.c|19|error: 'status' undeclared (first use in this function)|
~manydice.c|19|note: each undeclared identifier is reported only once for each function it appears in|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
选项:(使用代码:: blocks 16.01 mingw 32bit --gcc version显示gcc 4.9.2,Windows 7 Ultimate 32 bit)
mingw32-gcc.exe -Wall -g -std=c99 -c
为什么我收到此错误?
答案 0 :(得分:1)
首先,您声称在C"控制部分"中允许变量声明,其中您显然包含if
声明的条件。你误会了。从C99开始,允许声明代替for
循环的控制子句中的第一个表达式,但 不 代替其他控制表达式流控制结构,例如if
或while
语句。
排在第二位,"声明"不是"第一次出现"的同义词。标识符的声明至少将类型信息与该标识符相关联,并且其放置确定标识符的范围。如果存在 no 声明(如您的情况),那么可以使用 no 范围来使用标识符。 Primordial C对此有更宽松的规则,但由于你似乎想要依赖C99,那些是无关紧要的。
变量status
最简单的声明就是:
int status;
这需要在第一次使用该变量之前出现,并且其范围扩展到最里面的封闭块的末尾,或者如果它出现在任何块之外,则延伸到文件的末尾。但是,在你的情况下,我可能只是替换
if((status = scanf("%d", &dice)) != 1)
与
int status = scanf("%d", &dice);
if (status != 1)
两者都声明status
并计算它的初始值,然后使用它。我发现比在同一表达式中执行值计算和测试更清晰。
答案 1 :(得分:0)
您的期望(或理解)是错误的。
引用章节§6.8.4.1,preserveDrawingBuffer
,C11
语句的语法是
if
表达if (
声明
并且,变量声明 不 expresssion声明。
但是,您可以在语句部分中定义一个变量。