在C内部控制部分中声明变量时编译时间错误

时间:2016-12-19 17:36:29

标签: c gcc syntax c99

我正在尝试编译一个程序(清单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

为什么我收到此错误?

2 个答案:

答案 0 :(得分:1)

首先,您声称在C"控制部分"中允许变量声明,其中您显然包含if声明的条件。你误会了。从C99开始,允许声明代替for循环的控制子句中的第一个表达式,但 代替其他控制表达式流控制结构,例如ifwhile语句。

排在第二位,"声明"不是"第一次出现"的同义词。标识符的声明至少将类型信息与该标识符相关联,并且其放置确定标识符的范围。如果存在 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,preserveDrawingBufferC11语句的语法是

  

if 表达 if ( 声明

并且,变量声明 expresssion声明

但是,您可以在语句部分中定义一个变量。