2010-10-05 3 views
2

Je remarque dans plusieurs API, que vous pouvez créer une structure qui est utilisée en interne et qui n'a rien. ex:Comment fonctionnent les structures cachées?

ALLEGRO_BITMAP *bmp; 

... 
bmp->(intellesense shows nothing) 

Comment ces types de structures fonctionnent-elles? sont-ils simplement traités comme ça en interne?

REAL_ALLEGRO_BITMAP *realbmp = (REAL_ALLEGRO_BITMAP*)bmp; 

ou existe-t-il une solution de nettoyage?

Merci

+2

Le fait que l'intellisense ne montre rien ne signifie pas qu'il est vide. Vous pouvez ne pas avoir le code source dans le projet. – JoshD

+1

Je ne connais pas très bien Visual Studio, mais dans mon utilisation j'ai provisoirement conclu que le fait de déclarer une classe/struct (c'est-à-dire 'struct REAL_ALLEGRO_BITMAP;' sans le corps {...}) inhibe intellisense de cette manière. Je suis sûr que d'autres lecteurs peuvent confirmer/réprimander ... –

+0

Ok, c'est ainsi que c'est fait – jmasterx

Répondre

5

Qu'est-ce que vous regardez est un pointeur opaque ou type de données opaque (link et link). Voici un fil de discussion sur ces sujets: What is an opaque value?

0

En termes simples, une structure "cachée" est une structure pour laquelle vous avez une déclaration mais pas de définition. Dans le cas où une API fournit ce type de structure, cela signifie que vous ne devriez pas avoir à vous soucier de ce à quoi ressemblent les internes de la structure. Vous donner la déclaration fournit suffisamment d'informations pour que vous puissiez créer des pointeurs vers ce type de structure, ce qui est généralement suffisant lorsque vous utilisez l'API associée.

Dans votre cas, le fonctionnement interne de l'API ont probablement une définition qui ressemble à ceci:

struct allegro_bitmap { 
    /* Insert mystery internals here */ 
}; 
#define ALLEGRO_BITMAP struct allegro_bitmap 

Quelque part dans l'un des en-têtes que vous, vous avez travaillé seulement une simple déclaration:

struct allegro_bitmap; 
#define ALLEGRO_BITMAP struct allegro_bitmap 

Il s'agit d'informations suffisantes pour le compilateur et l'éditeur de liens pour générer votre code et le lier à la bibliothèque associée. Pour faire quelque chose d'utile avec le pointeur, vous devez utiliser les fonctions API (puisqu'elles ont la définition complète de la structure).

+0

Pourquoi '# define' et pas 'typedef'? –

+0

J'ai vu ça dans les deux sens. En général, j'ai vu le formulaire 'typedef' utilisé lorsque l'API utilise' struct allegro_bitmap' en interne et veut fournir une interface plus simple aux utilisateurs (l'utilisateur n'a pas à se soucier s'il s'agit d'un simple type ou structure de données). Dans ce cas, la forme de la macro peut être un peu plus propre que la forme 'typedef'. C'est plus une question de préférence personnelle que toute autre chose. – bta