2011-03-16 6 views
5
| GOTO '*' expr ';' 

Nunca he visto tales declaraciones todavía, cualquiera puede dar un ejemplo?Cuándo usamos goto * expr; ¿Cª?

+5

No se parece a C para mí. – bmargulies

+5

No sé quién votó para cerrar esto, pero es una pregunta perfectamente razonable. –

+3

@Tomalak Geret'kal: Probablemente alguien que asumió que, debido a que no reconoció la sintaxis, no debe ser un código válido. –

Respuesta

3

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.

+0

No creo que se trate de "llamadas de cola" u "optimizaciones", es solo una extensión de GCC para uso más general. –

+0

Creo que es discutible que las llamadas finales estén cerca del único uso * seguro * de esa construcción. – geekosaur

+0

No significa que es su propósito. –

2

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.)

6

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: 
} 
1

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; 
} 
+0

Desafortunadamente, la sintaxis &&

0

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.

+0

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. –

+0

@JeffSzuhay: Esta respuesta no afirma que goto se considera perjudicial, sino que el GNU C calculado-goto es dañino. –

Cuestiones relacionadas