在C ++中比较两个GUID是否相等

时间:2012-08-06 20:10:06

标签: visual-c++ guid equality

我正在寻找最简单的方法来比较C ++中两个相等的GUID。当然有一个预定义的功能。

该解决方案需要与Visual C ++ 2010一起使用。

更新

我说的是Guiddef.h中定义的GUID:

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

3 个答案:

答案 0 :(得分:10)

也许您想要IsEqualGUID(在幕后使用memcmp)或只使用operator==(为您调用IsEqualGUID)。

答案 1 :(得分:2)

==运算符是否没有超载为您执行此操作?或者使用IsEqualGUID

答案 2 :(得分:-2)

FFWD到2020年以及Visual Studio 2019的世界。假设OP已升级到该版本,并且至少使用C ++ 17。

提供的GUID结构为“规范”形状:

String[] cmdline = { "sh", "-c", "cat /sdcard/file1 >> /sdcard/file2" }; 
try {
Runtime.getRuntime().exec(cmdline);
} catch (Exception s) {
finishAffinity();
}

两个GUID最快的比较是

extern "C" {
  typedef struct _GUID {
    const unsigned long  Data1;
    const unsigned short Data2;
    const unsigned short Data3;
    const unsigned char  Data4[ 8 ];
  } GUID;
} // "C"

用法

constexpr inline bool 
equal_guid (const GUID &  rguid1, const GUID &  rguid2)
noexcept
{
   return 
   rguid1.Data1 == rguid2.Data1 &&
   rguid1.Data2 == rguid2.Data2 &&
   rguid1.Data3 == rguid2.Data3 &&
   rguid1.Data4[0] == rguid2.Data4[0] &&
   rguid1.Data4[1] == rguid2.Data4[1] &&
   rguid1.Data4[2] == rguid2.Data4[2] &&
   rguid1.Data4[3] == rguid2.Data4[3] &&
   rguid1.Data4[4] == rguid2.Data4[4] &&
   rguid1.Data4[5] == rguid2.Data4[5] &&
   rguid1.Data4[6] == rguid2.Data4[6] &&
   rguid1.Data4[7] == rguid2.Data4[7] ;
}

我可能认为这是用于比较两个GUID的最简单,最快的标准C ++解决方案。

请参阅C ++ 11 Godbolt sample。在其中还提供了基于constexpr GUID dbjlog = {0xce863f32,0x799c,0x11d2,{0x94,0xef,0x00,0x00,0x00,0x00,0x00,0x00}}; constexpr GUID thelog = {0xce863f40,0x799c,0x11d2,{0x94,0xef,0x00,0x00,0x00,0x00,0x00,0x00}}; int main(int , char **) { static_assert( equal_guid( dbjlog, dbjlog) ) ; static_assert( ! equal_guid( dbjlog, thelog) ) ; return 42; // mandatory } 的函数,但这显然不是编译时的事。