compiler c gcc

compiler - makefile



¿Por qué obtengo "una etiqueta que solo puede ser parte de una declaración y una declaración no es una declaración" si tengo una variable que se inicializa después de una etiqueta? (2)

El estándar de lenguaje simplemente no lo permite. Las etiquetas solo pueden seguirse de enunciados y las declaraciones no cuentan como enunciados en C. La forma más fácil de evitar esto es insertando una instrucción vacía después de su etiqueta, lo que le alivia de hacer un seguimiento del alcance de la manera en que lo haría necesario. dentro de un bloque.

#include <stdio.h> int main () { printf("Hello "); goto Cleanup; Cleanup: ; //This is an empty statement. char *str = "World/n"; printf("%s/n", str); }

Esta pregunta ya tiene una respuesta aquí:

Tengo el siguiente código simplificado:

#include <stdio.h> int main () { printf("Hello "); goto Cleanup; Cleanup: char *str = "World/n"; printf("%s/n", str); }

Aparece un error porque se declara una nueva variable después de la etiqueta. Si pongo el contenido (principalmente la inicialización) después de la etiqueta en un bloque {}, la compilación tiene éxito.

Creo que entiendo la razón del bloqueo en caso de un cambio, pero ¿por qué debería ser aplicable en el caso de una etiqueta?

Este error es de un compilador gcc


Esta es una peculiaridad de la gramática C. No se permite que una etiqueta ( Cleanup: aparezca inmediatamente antes de una declaración (como char *str ...; ), solo antes de una declaración ( printf(...); ). En C89 no fue una gran dificultad porque las declaraciones solo podían aparecer al principio de un bloque, por lo que siempre se podía mover un poco la etiqueta y evitar el problema. En C99 puede mezclar declaraciones y código, pero aún no puede poner una etiqueta inmediatamente antes de una declaración.

Puede poner un punto y coma inmediatamente después de los dos puntos de la etiqueta (como lo sugiere Renan) para que haya una declaración vacía allí; esto es lo que haría en el código generado por la máquina. Alternativamente, levante la declaración al principio de la función:

int main (void) { char *str; printf("Hello "); goto Cleanup; Cleanup: str = "World/n"; printf("%s/n", str); return 0; }