2010-10-12 31 views
4

Quelle est la définition de Type incomplet et Type d'objet dans C? Aussi, pourriez-vous fournir quelques exemples de chacun?Quelle est la définition de type incomplet et type d'objet dans C?

ANSI C99 mentionne les deux catégories de types à différents endroits, même si j'ai trouvé difficile de comprendre ce que chacun d'eux signifie exactement (il n'y a pas de paragraphe/phrase qui définisse explicitement ce qu'ils sont).

+1

C99 utilise le type de référence _? Vraiment? (Si vous avez la spécification C99 disponible, la section 6.2.5 traite en profondeur du système de type C. Elle commence par les définitions des trois catégories de types de niveau supérieur: types d'objet, types de fonction et types incomplets) –

+0

Mon erreur, ça ne marche pas t. Je vais retirer cela de la question. Merci pour la capture! –

+0

C'est exactement la section dont je parlais, mais je n'ai pas posté dans ma question. ;) 6.2.5 mentionne ces catégories de haut niveau, mais ne semble jamais dire «quoi» à l'intérieur d'eux. Types de fonctions est facile à comprendre, mais je suis encore confus en ce qui concerne les différences entre le type incomplet et le type d'objet.Pour les types incomplets, "types qui décrivent les objets mais manquent d'informations nécessaires pour déterminer leur taille" - qu'est-ce qu'un exemple de quelque chose qui manque d'informations nécessaires pour déterminer sa taille? –

Répondre

6

Allons à la online C standard (draft n1256):

6.2.5 Types

1 La signification d'une valeur stockée dans un objet ou retourné par une fonction est déterminée par le tapez de l'expression utilisée pour y accéder. (Un identificateur déclaré être un objet est l'expression la plus simple, le type est spécifié dans la déclaration de l'identificateur.) Les types sont divisés en types d'objet (types qui décrivent complètement les objets), types de fonctions (types qui décrivent fonctions), et types incomplets (types qui décrivent des objets mais manquent d'informations nécessaires pour déterminer leur taille).

Exemples de incomplètes types:

struct f; // introduces struct f tag, but no struct definition 
int a[];  // introduces a as an array but with no defined size 

Vous ne pouvez pas créer des instances de types incomplets, mais vous peut créer des pointeurs et typedef noms de types incomplets:

struct f *foo; 
typedef struct f Ftype; 

Pour activer la structure incomplète dans un type d'objet, nous devons définir la structure:

+0

Merci John, réponse très claire! :) –

0

Les types que je connais sont:

  • type incomplet
  • type d'objet
  • type de fonction

Voici un exemple (aussi CodePad: http://codepad.org/bzovTRmz)

#include <stddef.h> 

int main(void) { 
    int i; 
    struct incomplete *p1; 
    int *p2; 
    int (*p3)(void); 

    p1 = NULL; /* p1 is a pointer to a incomplete type */ 
    p2 = &i; /* p2 is a pointer to an object */ 
    p3 = main; /* p3 is a pointer to a function */ 

    return 0; 
} 

Le struct incomplete peut être défini (avec une taille définie) dans une autre unité de traduction. Cette unité de traduction n'a besoin que le pointeur se

+0

Merci pour la réponse pmg! –