变量集,但未使用警告,但还有错误的未声明标识符

问题描述 投票:0回答:3

调试器告诉我,我不使用变量,但也未声明它。这里发生了什么? if语句是它自己的作用域吗?不知何故,固定长度的数组似乎不在if块内的同一作用域内。

我的最小例子

#include <stdio.h>
#include <stdlib.h>

void nullarray(int start,int end,  char array[]){
if(start<end) // TODO used to be <=
    {
    array[start]='0';
    nullarray(++start,end,array);
    }else{array[start]='\0';}

}


int main()
{
    int commaindex2=-1;
    int mostdecimaldigits=6;

      if(commaindex2==-1){
            char decimalnum2[1];decimalnum2[0]='0';
            }
    else{
    char decimalnum2[mostdecimaldigits]; // get enought store incl filling up zeros
    nullarray(0,mostdecimaldigits,decimalnum2); // write zeros to array

    }
     printf("%s", decimalnum2);
}

调试器输出

||=== Build: Debug in test4 (compiler: GNU GCC Compiler) ===|
D:\main.c||In function 'main':|
D:\main.c|20|warning: variable 'decimalnum2' set but not used [-Wunused-but-set-variable]|
D:\main.c|27|error: 'decimalnum2' undeclared (first use in this function)|
D:\main.c|27|note: each undeclared identifier is reported only once for each function it appears in|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

但是这很好用

int main()
{
    int commaindex2=55;
    int mostdecimaldigits=6;
    int num;
      if(commaindex2==-1){
           num=1 ;
            }
    else{
   num=mostdecimaldigits;

    }
     char decimalnum2[num];
     nullarray(0,num,decimalnum2);
     printf("%s", decimalnum2);
}
c scoping undeclared-identifier
3个回答
4
投票

这里发生了什么? if语句是否属于自己的作用域?

是-if语句(或更确切地说,其后的花括号)定义了自己的范围,else语句后的花括号也是如此(但这是different范围)。] >

因此,您的声明char decimalnum2[1];char decimalnum2[mostdecimaldigits];(分别在ifelse块中)定义了有效的变量(单独的,不相关的变量)仅在出现括号的地方

因此,语句:printf("%s", decimalnum2);,在两个块之外,正在尝试使用未声明的变量-因此出错。

[此外,语句decimalnum2[0]='0';(在if块中)为(块本地)变量分配了一个值,该值随后将不再使用-因此发出警告。

快速解决方案:您需要将char decimalnum2[mostdecimaldigits];声明放在before

outside两个if … else块中,并删除两个声明inside这些块。

2
投票

一组花括号开始一个新的作用域,因此在您的第一段代码decimalnum2中声明了两个不同的作用域,一个在if块内部,一个在else块内部。这两个都是不同的变量,一旦离开该范围就不再存在。


0
投票

正如UnholySheep指出的那样,C中存在块范围。这意味着该变量在if块的}之后停止存在。因此无法打印这些值。

© www.soinside.com 2019 - 2024. All rights reserved.