问题一:
原因是由于我在case之后进行变量的声明而导致的错误
对此问题的分析:
由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间 也就是整个switch语句,其他的case语句也能看到,这样的话就可能导致错误。我们可以通过在case后面的语句加上大括号处理,之所以加大括号就是为了明确我们声明的变量的作用域,就是仅仅在本case之中,其实为了更规范的写switch-case语句,我们应该在case语句后边加大括号。
问题二:
之前写代码的时候用了一个goto语句,结果编译提示a label can only be part of a statement and a declaration is not a statement
发现了问题的症结所在:原来是由于我在label之后进行变量的声明而导致的错误,label只能是语句的一部分,而变量的声明并不是一个语句。
原来代码的粗略流程如下:
if (!zmhss_fsready()) {
goto defaul_init;
}
........
defaul_init:
struct rlimit rlmt;
if (ccf->rlimit_nofile != -1) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;
rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;
if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
exit(2);
}
}
就是上面这一句struct rlimit rlmt;才最终导致了编译过程出现的错误提示,解决的方法是将这句struct rlimit rlmt;对变量的声明移到label之前即可,即修改后代码结构体如下:
struct rlimit rlmt;
if (!zmhss_fsready()) {
goto defaul_init;
}
........
defaul_init:
if (ccf->rlimit_nofile != -1) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;
rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;
if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
exit(2);
}
}
经过上述修改后,问题得以解决。从这个问题可以做一个引申,即在写代码的时候,变量的声明不应该出现在label之后,比如switch语句中的case结构也可能会遇到类似的问题。