错误“a label can only be part of a statement and a declaration is not a statement”解决方法

Posted 我是CodeAllen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误“a label can only be part of a statement and a declaration is not a statement”解决方法相关的知识,希望对你有一定的参考价值。

之前写代码的时候用了一个goto语句,结果编译提示a label can only be part of a statement and a declaration is not a statement,一开始并不理解,因为之前一直没碰到过类似的错误,google了一下也找不到满意的答案,最后又仔细琢磨了这个错误,并对比代码,终于发现了问题的症结所在:原来是由于我在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结构也可能会遇到类似的问题。

PS:从一个#if...#endif宏块goto到宏块以外,会有一个编译告警。

以上是关于错误“a label can only be part of a statement and a declaration is not a statement”解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思

PHP错误处理

PHP的错误处理