2009-11-13 15 views
9

Veuillez vérifier le programme ci-dessous.C Puzzle - jouer avec les types

#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) ; 
} 

Voici les questions

  1. Quelle est la sortie du programme?
  2. Où est ';' mettre fin à la déclaration de «struct st»?

    Selon la spécification ISO CEI 9899 - 1999 , la déclaration doit se terminer par un ';'.

    declaration-specifiers init-declarator-listopt ; 
    
  3. Si la déclaration du « struct st » est prise qui ne représente que le type de retour de la fonction « fn », comment est-il visible à d'autres fonctions (principal)?

+0

Comeau se plaint du manque; après la structure et aussi que fn() n'a pas de type de retour. – foraidt

+0

Travail à domicile? ;) Je pense que la sortie serait 10, formatée en décimal (je suppose que c'est ce que% d signifie) – invert

+0

Spécifiquement il dit: ligne 3: erreur: définition de type n'est pas autorisée dans la déclaration de type de retour de fonction – foraidt

Répondre

5

Les choses peuvent être un peu plus clair si nous reconstruisons un peu le code:

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

Ainsi, le type de retour est fn()struct st {int a;}. Il n'y a pas de point-virgule après la définition de la structure car le type de structure fait partie de la définition de la fonction (trace à travers la grammaire de translation-unit ->top-level-declaration ->function-definition). Le type struct est disponible à main() car vous y avez ajouté une balise struct (st). Si vous aviez écrit

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

alors le type n'aurait pas été disponible pour main(); vous auriez dû créer un nouveau type de structure avec la même définition.

Vous obtenez le même effet que si vous aviez écrit

struct st { 
    int a; 
}; 

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

int main() 
{ 
    /* same as before */ 
} 
9
  1. La sortie est 10.
  2. Il n'a pas besoin d'être un point-virgule parce que tout est une définition de fonction.
  3. La balise de structure st est déclarée au niveau de l'étendue globale et est donc visible à la main.
+0

+1 exactement ce que j'étais sur le point d'écrire. –

+0

4. GCC est un peu plus indulgent que je ne le pensais. –