了解指针引用的工作原理

时间:2009-11-02 01:08:35

标签: c++ com pointers guid

我目前正在阅读“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 个答案:

答案 0 :(得分:4)

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 ++)或许

答案 1 :(得分:3)

define REFGUID是指向GUID的指针,其中以下内容为真

  1. 无法将指针重新指定给其他GUID
  2. 通过指针访问时GUID的内容被视为const

答案 2 :(得分:3)

REFGUID在C ++和C上下文中的定义不同。如果你看一下它的定义,那就是:

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

IsEqualGUID()函数也有不同的实现。

我不喜欢这个主意。我猜这个人发明这个只是为了让它“C ++正确”,因为C ++发明者认为引用比指针好。

答案 3 :(得分:1)

#define REFGUID const GUID * const

等于(不是C ++代码,抽象!)

const GUID * const  ==  REFGUID 

等于

GUID const  * const  ==  REFGUID 

所以它是const指针(不能改变poiter)到const GUID对象(不能改变值)。