Понимание того, как работает указатель ссылки - PullRequest
1 голос
/ 02 ноября 2009

В настоящее время я читаю «Семинар разработчика для COM и ATL 3.0». Глава 3 представляет GUID, ссылки и сравнения. Указатели больно. Я мог бы использовать некоторую помощь в расшифровке REFGUID #define (см. Ниже) и как memcmp в IsEqualGUID работает против указателей.

Дано:

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

Как мне интерпретировать это #define ?:

 #define REFGUID const GUID * const  

Как &rguid1 обращается к входящей переменной?

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

Ответы [ 4 ]

4 голосов
/ 02 ноября 2009

REFGUID является постоянным ptr для постоянного guid (т.е. ни один не может измениться).

Неужели код не будет?

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

, поскольку memcmp принимает:

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

В memcmp должны передаваться указатели (rguidx), а не адрес указателя.

если выглядит так, будто код изначально был написан с REGUID, определенным как const GUID или ссылка на const GUID (C ++), возможно

3 голосов
/ 02 ноября 2009

REFGUID определяется по-разному в контексте C ++ и C. Если вы посмотрите на его определение, это:

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

Функция IsEqualGUID () также имеет различные реализации.

Мне не нравится эта идея. Я предполагаю, что человек изобрел это просто для того, чтобы сделать это "правильным C ++", потому что изобретатель C ++ считает, что ссылка лучше, чем указатель.

3 голосов
/ 02 ноября 2009

Определение REFGUID является указателем на GUID, для которого верно следующее

  1. Указатель не может быть переназначен другому GUID
  2. Содержимое GUID при обращении через указатель считается постоянным
1 голос
/ 02 ноября 2009
#define REFGUID const GUID * const

равно (не код C ++, аннотация!)

const GUID * const  ==  REFGUID 

и равно

GUID const  * const  ==  REFGUID 

таким образом, это константный указатель (не может изменить poiter) на const GUID объект (не может изменить значение).

...