2009-11-02 8 views
1

Je suis en train de lire "Developer's Workshop to COM and ATL 3.0". Le chapitre 3 présente les GUID, le référencement et les comparaisons. Les pointeurs sont douloureux. Je pourrais utiliser un peu d'aide pour déchiffrer le REFGUID #define (voir ci-dessous) et comment memcmp dans IsEqualGUID fonctionne contre les pointeurs.Comprendre le fonctionnement du référencement du pointeur

Étant donné:

typedef struct_GUID{ unsigned long Data1; 
    unsigned short Data2; 
    unsigned short Data3; 
    unsigned char Data4[8]; } GUID; 

Comment interpréter cette #define:

#define REFGUID const GUID * const 

Comment la &rguid1 adresse la variable entrant?

BOOL IsEqualGUID(REFGUID rguid1, REFGUID rguid2) 
    { 
     return !memcmp(&rguid1, &rguid2, sizeof(GUID)); 
    } 
+2

Vous devriez en apprendre davantage sur les pointeurs en essayant de comprendre une bibliothèque compliquée comme ATL. – jmucchiello

+0

Merci pour le commentaire jmucchiello. Si vous voyez la réponse de Preet ci-dessous, il apparaît que le code dans le livre est incorrect. C'est ce qui m'a jeté.Bien que je ne sois pas un expert en pointeurs, je ne me crois pas non plus un débutant. Le code incorrect du livre est ce qui m'a jeté. – BigBrother

Répondre

4

Le REFGUID est la constante ptr à une constante guid (c'est-à-dire que ni l'un ni l'autre ne peut changer).

Le code ne doit pas être?

BOOL IsEqualGUID(REFGUID rguid1, REFGUID rguid2) 
{   
    return !memcmp(rguid1, rguid2, sizeof(GUID));  
} 

comme memcmp prend:

int memcmp(const void *s1, const void *s2, size_t n); 

Le memcmp doit être transmis les pointeurs (rguidx) pas l'adresse du pointeur.

ressemble si le code a été écrit à l'origine avec REGUID défini comme un GUID const ou const référence GUID (C++) peut-être

+0

Je suppose que vous avez raison. Je parie que Joe a mélangé la déclaration C pour REFGUID et la définition C++ pour IsEqualGUID. –

+1

Très bon commentaire. J'ai copié le code directement du livre. Ce qui semble être faux étant donné les commentaires que je vois dans les réponses. Si le livre illustrait le memcmp à apparaître comme vous l'avez dit plus haut, je n'aurais pas été jeté par la syntaxe qui nécessite la question SO. Merci pour l'info! – BigBrother

3

L'définie REFGUID est un pointeur sur un GUID pour lequel ce qui suit est vrai

  1. Le pointeur ne peut pas être ré-affecté à un autre GUID
  2. Le contenu du GUID quand on y accède par le pointeur est considéré const
3

REFGUID est défini différemment en C++ et le contexte C. Si vous regardez sa définition, il est:

#ifdef __cplusplus 
#define REFGUID const GUID & 
#else 
#define REFGUID const GUID * 
#endif 

La fonction IsEqualGUID() a également différentes implémentations.

Je n'aime pas cette idée. Je suppose que la personne a inventé ceci juste pour le rendre "C++ correct" parce que l'inventeur C++ croit que la référence est meilleure que le pointeur.

+0

pas utile ou d'actualité. –

+0

effectivement, cela répond parfaitement à la question de l'affiche originale. up-voting. le memcmp Joe posait des questions sur le sens de la définition C++ REFGUID. –

1
#define REFGUID const GUID * const 

est égal à (non code C++, résumé!)

const GUID * const == REFGUID 

et il est égal à

GUID const * const == REFGUID 

il est donc pointeur const (ne peut pas changer poiter) à un objet GUID constant (ne peut pas changer la valeur).

Questions connexes