| GOTO '*' expr ';'
Nunca he visto tales declaraciones todavía, cualquiera puede dar un ejemplo?Cuándo usamos goto * expr; ¿Cª?
| GOTO '*' expr ';'
Nunca he visto tales declaraciones todavía, cualquiera puede dar un ejemplo?Cuándo usamos goto * expr; ¿Cª?
IIRC es un GNU-ismo para las llamadas de cola. Normalmente dejaría esa optimización al compilador, pero puede ser útil al escribir kernels o controladores de dispositivos integrados.
No creo que se trate de "llamadas de cola" u "optimizaciones", es solo una extensión de GCC para uso más general. –
Creo que es discutible que las llamadas finales estén cerca del único uso * seguro * de esa construcción. – geekosaur
No significa que es su propósito. –
Eso es específico de GCC. No es estándar C (C89 o C99). (Sería ser útil a veces, sin embargo, ser capaz de hacer GOTOS calculados.)
Esto se llama así Labels as Values y representa una de las extensiones del CCG.
Como ejemplo, he aplicado esta extensión para dar una answer-Printing 1 to 1000 without loop or conditionals pregunta:
void printMe()
{
int i = 1;
startPrintMe:
printf ("%d\n", i);
void *labelPtr = &&startPrintMe + (&&exitPrintMe - &&startPrintMe) * (i++/1000);
goto *labelPtr;
exitPrintMe:
}
similares a PrintMe() ya dada, aquí está mi solución utilizando un "salto mesa" resolviendo el mismo problema excepto que puede hacer un # número de operaciones arbitrarias, en este caso printf(). Tenga en cuenta que las etiquetas referenciadas deben ser locales para la función.
int print_iterate(int count)
{
int i=0;
void * jump_table[2] = { &&start_label , &&stop_label };
start_label:
printf(++i);
// using integer division: i/count will be 0 until count is reached (then it is 1)
goto *jump_table[ i/count ];
stop_label:
return 0;
}
Desafortunadamente, la sintaxis &&
Nunca. No es C. Es posible en "GNU C", pero es, como comentó Paul, "una de las peores características de FORTRAN", "portado ... en C", y por lo tanto debe considerarse Nocivo.
En realidad, no. Incluso los autores de C reconocieron que había algunas circunstancias en las que un 'goto' podría preferirse a los otros controles estructurados en C. Otorgado,' continuar' y 'break' son un largo camino para obviar la necesidad de' goto'. El consejo general sigue siendo: use 'goto' con moderación. –
@JeffSzuhay: Esta respuesta no afirma que goto se considera perjudicial, sino que el GNU C calculado-goto es dañino. –
No se parece a C para mí. – bmargulies
No sé quién votó para cerrar esto, pero es una pregunta perfectamente razonable. –
@Tomalak Geret'kal: Probablemente alguien que asumió que, debido a que no reconoció la sintaxis, no debe ser un código válido. –