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.