Niv*_*ius 0 c scoping 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]='\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);
}
Run Code Online (Sandbox Code Playgroud)
调试器输出
||=== 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)) ===|
Run Code Online (Sandbox Code Playgroud)
不过这工作正常
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);
}
Run Code Online (Sandbox Code Playgroud)
\n\n\n这里发生了什么?if 语句有自己的作用域吗?
\n
是的 -if语句(或者,准确地说,后面的大括号)定义了自己的范围,就像else语句后面的大括号一样(但这是不同的范围)。
因此,您的声明char decimalnum2[1];和char decimalnum2[mostdecimaldigits];(分别在if和块中)定义了仅在它们出现的大括号内else有效的变量(单独的、不相关的变量)。
因此,位于两个块之外的语句:printf("%s", decimalnum2);正在尝试使用未声明的变量 - 因此会出现错误。
此外,该语句decimalnum2[0]=\'0\';(在if块中)为(块局部)变量分配了一个值,该值随后从未被使用 - 因此出现警告。
快速解决方案:您需要将char decimalnum2[mostdecimaldigits];声明放在块之前和外部,并删除这些块内的if \xe2\x80\xa6 else两个声明。
| 归档时间: |
|
| 查看次数: |
1311 次 |
| 最近记录: |