Erro "uma etiqueta só pode ser parte de uma declaração e uma declaração não é uma declaração" solução

Original: https://blog.csdn.net/weiyuefei/article/details/31775043 

 Quando escrevi o código antes, usei uma instrução goto, e o compilador solicita que um rótulo só pode ser parte de uma instrução e uma declaração não é uma instrução. Não entendi a princípio, porque não encontrei um erro semelhante antes, pesquisei no Google. Não consegui encontrar uma resposta satisfatória. Por fim, ponderei cuidadosamente sobre o erro e comparei o código. Finalmente, encontrei o cerne do problema: acabou sendo o erro causado pela declaração da variável após a etiqueta. A etiqueta só pode ser uma declaração. A declaração de uma variável não é uma declaração.

        O fluxo aproximado do código original é o seguinte:

        if (! zmhss_fsready ()) {             ir para 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) {

                   saída (2);
            }
       }

 

        É a frase acima de struct rlimit rlmt; que finalmente levou à mensagem de erro no processo de compilação. A solução é mover esta frase de struct rlimit rlmt; para a declaração da variável antes do rótulo, ou seja, a estrutura de código modificada é do seguinte modo:

        struct rlimit rlmt;

        if (! zmhss_fsready ()) {             ir para 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) {

                   saída (2);
            }
       }

        Após a modificação acima, o problema foi resolvido. Uma extensão pode ser feita a partir deste problema, ou seja, ao escrever o código, as declarações de variáveis ​​não devem aparecer após o rótulo.Por exemplo, a estrutura de caso na instrução switch também pode encontrar problemas semelhantes.

 

PS: De um bloco de macro #if ... # endif ir para fora do bloco de macro, haverá um aviso de compilação.
 

Acho que você gosta

Origin blog.csdn.net/xiaolei251990/article/details/85133585
Recomendado
Clasificación