2009-11-13 13 views
9

Por favor, compruebe el programa a continuación.C Puzzle - jugar con los tipos

#include <stdio.h> 

struct st 
{ 
int a ; 
} 

fn() 
{ 
struct st obj ; 
obj.a = 10 ; 

return obj ; 
} 

int main() 
{ 
struct st obj = fn() ; 

printf ("%d", obj.a) ; 
} 

A continuación se presentan las preguntas

  1. ¿Cuál es la salida del programa?
  2. ¿Dónde está ';' terminando la declaración de 'struct st'?

    Por ISO IEC 9899 - 1999 especificación, la declaración debe terminar con un ';'.

    declaration-specifiers init-declarator-listopt ; 
    
  3. Si se toma la declaración de la 'estructura st' que representa sólo el tipo de retorno de la función 'fn', ¿cómo es visible a otras funciones (principal)?

+0

Comeau se queja de la falta; después de la estructura y también que fn() no tiene tipo de retorno. – foraidt

+0

¿Deberes? ;) Creo que la salida sería 10, formateada como decimal (supongo que eso es lo que% d significa) – invert

+0

Específicamente dice: línea 3: error: definición de tipo no está permitido en la función return type declaration – foraidt

Respuesta

5

cosas pueden ser un poco más claro si reformatear el código un poco:

struct st { int a; } fn() 
{ 
    struct st obj; 
    obj.a = 10; 
    return obj; 
} 
int main() 
{ 
    struct st obj = fn(); 
    printf("%d\n", obj.a); 
    return 0; 
} 

Por lo tanto, el tipo de retorno de fn() es struct st {int a;}. No hay punto y coma después de la definición de estructura porque el tipo de estructura es parte de la definición de la función (seguimiento a través de la gramática de translation-unit ->top-level-declaration ->function-definition). El tipo de estructura está disponible para main() porque pone una etiqueta struct en él (st). Si hubiera escrito

struct { int a; } fn() {...} 

entonces el tipo no habría estado disponible para main(); tendrías que crear un nuevo tipo de estructura con la misma definición.

se obtiene el mismo efecto que si hubiera escrito

struct st { 
    int a; 
}; 

struct st fn() 
{ 
    /* same as before */ 
} 

int main() 
{ 
    /* same as before */ 
} 
9
  1. La salida es de 10.
  2. No tiene por qué ser un punto y coma, ya que todo esto es una definición de función.
  3. La etiqueta de estructura st está declarada en el alcance global y, por lo tanto, es visible para main.
+0

+1 exactamente lo que estaba a punto de escribir. –

+0

4. GCC es un poco más indulgente de lo que pensaba. –

Cuestiones relacionadas