这种问题极容易出现在switch中申明变量(根本问题是变量作用域的原因)
对此问题的分析:
由于switch的几个case语句在同一个作用域(因为case语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间 也就是整个switch语句,其他的case语句也能看到,这样的话就可能导致错误。
解决方案:
我们可以通过在case后面的语句加上大括号处理,之所以加大括号就是为了明确我们声明的变量的作用域,就是仅仅在本case之中,其实为了更规范的写switch-case语句,我们应该在case语句后边加大括号。在case语句后加一个分号也可以解决问题!
比如:
pid_t rank_fork_fd = fork();
switch(rank_fork_fd)
{
case -1:
perror("fork");
exit(-2);
case 0:
printf(" i am child\n");
char str[100] = {0};
scanf("%s",str);
write(pipe_fd[1],str,strlen(str));
close(pipe_fd[1]);
_exit(EXIT_SUCCESS);
default:
char buf[30] = {0};
read(pipe_fd[0],buf,30);
printf("parent process:%s\n",buf);
close(pipe_fd[0]);
exit(EXIT_SUCCESS);
}
报错显示:
pipe.c: In function ‘main’:
pipe.c:37:4: error: a label can only be part of a statement and a declaration is not a statement
char buf[30] = {0};
解决方法:在case语句中加一个{}就可以(限制变量的作用域)
switch(rank_fork_fd)
{
case -1:
perror("fork");
exit(-2);
case 0:
{
printf(" i am child\n");
char str[100] = {0};
scanf("%s",str);
write(pipe_fd[1],str,strlen(str));
close(pipe_fd[1]);
_exit(EXIT_SUCCESS);
}
default:
{
char buf[30] = {0};
read(pipe_fd[0],buf,30);
printf("parent process:%s\n",buf);
close(pipe_fd[0]);
exit(EXIT_SUCCESS);
}
}