变量设置但未使用警告但也错误未声明的标识符
variable set but not used Warning but also error undeclared identifier
调试器告诉我我没有使用我的变量,但也没有声明它。这里发生了什么? 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]='[=10=]';}
}
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);
}
What is going on here? Is an if statement it's own scope?
是 - if
语句(或者更准确地说,它后面的大括号)定义了它自己的范围,else
语句之后的大括号也是如此(但那是 不同范围)。
因此,您的声明 char decimalnum2[1];
和 char decimalnum2[mostdecimaldigits];
(分别在 if
和 else
块中)定义了有效的变量(独立的、不相关的变量)仅在它们出现的大括号内。
因此,位于两个块之外的语句:printf("%s", decimalnum2);
试图使用未声明的变量 - 因此出现错误。
此外,语句 decimalnum2[0]='0';
(在 if
块中)为(块局部)变量分配了一个值,该变量随后从未使用过 - 因此出现警告。
快速解决方案:您需要将 char decimalnum2[mostdecimaldigits];
声明放在 之前 和 外部 if … else
块,并删除 inside 那些块中的两个声明。
正如 UnholySheep 指出的那样,C 中有块作用域。这意味着变量在 } 之后停止存在 if 块。因此无法打印这些值。
一组大括号开始一个新的范围,所以在你的第一段代码中 decimalnum2
在两个不同的范围内声明,一个在 if
块内,一个在 else
块。这两个都是不同的变量,一旦离开该范围就不再存在。
这就是您收到警告和错误的原因。您设置了变量但未在其声明的范围内使用它,并且您试图在其范围之外使用它。
调试器告诉我我没有使用我的变量,但也没有声明它。这里发生了什么? 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]='[=10=]';}
}
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);
}
What is going on here? Is an if statement it's own scope?
是 - if
语句(或者更准确地说,它后面的大括号)定义了它自己的范围,else
语句之后的大括号也是如此(但那是 不同范围)。
因此,您的声明 char decimalnum2[1];
和 char decimalnum2[mostdecimaldigits];
(分别在 if
和 else
块中)定义了有效的变量(独立的、不相关的变量)仅在它们出现的大括号内。
因此,位于两个块之外的语句:printf("%s", decimalnum2);
试图使用未声明的变量 - 因此出现错误。
此外,语句 decimalnum2[0]='0';
(在 if
块中)为(块局部)变量分配了一个值,该变量随后从未使用过 - 因此出现警告。
快速解决方案:您需要将 char decimalnum2[mostdecimaldigits];
声明放在 之前 和 外部 if … else
块,并删除 inside 那些块中的两个声明。
正如 UnholySheep 指出的那样,C 中有块作用域。这意味着变量在 } 之后停止存在 if 块。因此无法打印这些值。
一组大括号开始一个新的范围,所以在你的第一段代码中 decimalnum2
在两个不同的范围内声明,一个在 if
块内,一个在 else
块。这两个都是不同的变量,一旦离开该范围就不再存在。
这就是您收到警告和错误的原因。您设置了变量但未在其声明的范围内使用它,并且您试图在其范围之外使用它。