2010-12-10 7 views
1

Comment est-ce que je peux passer autour des pointeurs aux structures qui ont des définitions privées, sans préfixer les types de pointeur avec struct?Passer des pointeurs vers des structures privées en C?

Par exemple, cela fonctionne:

typedef struct Handle { 
    Ino ino; 
} Handle; 

bool handle_open(Handle **); 

Mais si je déplace la définition struct dans un fichier source, d'autres fichiers source sont contraints d'utiliser struct Handle *, au lieu de Handle *.

Répondre

5

Vous pouvez typedef struct Handle Handle;. Dans ce cas, Handle est un type incomplet (tout comme struct Handle).

+0

Cela semble fonctionner correctement. Cependant j'obtiens des erreurs si le typedef est fait au même type plus d'une fois. Un peu ennuyeux, toujours en train de l'essayer. –

+0

Que signifie "fait au même type"? – lijie

+0

oh. J'ai compris. comme dans, si vous faites 'typedef struct Handle Handle; typedef struct Handle Handle; '? Il y a une erreur car vous définissez deux fois le typedef 'Handle'. Si cela se produit dans un fichier d'en-tête, veuillez utiliser les gardes incluses. – lijie

2

Cela devrait aller bien dans un en-tête:

struct _Handle; 
typedef struct _Handle Handle; 

Ensuite, vous pouvez mettre la définition réelle de _Handle dans le corps du fichier qui manipule en fait la struct.

+2

votre deuxième ligne serait suffisante. il forward déclare aussi 'struct'. –

0

si je déplace la définition struct dans un fichier source, d'autres fichiers source sont contraints d'utiliser struct poignée *, au lieu de la poignée *

Puis typedef le pointeur, au lieu (ou en plus) la structure.

+0

Les types de pointeurs 'typedef'-ing ne sont généralement pas une bonne idée, et ce n'est pas nécessaire ici. – jamesdlin

+0

C'est une bonne idée quand le code appelant est supposé seulement obtenir des pointeurs sur n'importe quoi et ils n'ont pas besoin de savoir que c'est un pointeur (les deux sont impliqués par le nom 'Handle'). La dernière fois que j'ai vérifié, c'était une assez bonne idée pour Win32 (par exemple HWND) –

+1

Beaucoup de choses sont "assez bonnes" pour Windows. En fait Windows a "assez bien" écrit partout. –

Questions connexes