Visual c++ 在C+中比较两种GUI是否相等+; 我正在寻找比较C++中两个GUID的最简单方法。当然有一个预定义的函数 解决方案需要使用Visual C++ 2010。< /P>
更新: 我指的是Guiddef.h中定义的GUID:Visual c++ 在C+中比较两种GUI是否相等+; 我正在寻找比较C++中两个GUID的最简单方法。当然有一个预定义的函数 解决方案需要使用Visual C++ 2010。< /P>,visual-c++,guid,equality,Visual C++,Guid,Equality,更新: 我指的是Guiddef.h中定义的GUID: typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[ 8 ]; } GUID; ==运算符是否未重载以执行此操作?或者使用。也许你想要(在幕后使用memcmp)或者仅仅使用操作符==(为你调用IsEqualGUID)。到2020年的FFWD和2
typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;
==运算符是否未重载以执行此操作?或者使用。也许你想要(在幕后使用memcmp)或者仅仅使用
操作符==
(为你调用IsEqualGUID)。到2020年的FFWD和2019年的Visual Studio世界。假设OP已经升级到这一级别,并且至少享受C++17
提供的GUID结构为“规范”形状:
两个GUID之间最快的比较是
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] ;
}
用法
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
}
我认为这是比较GuID的最简单和最快的C++解决方案。
请参阅C++11。其中还提供了基于memcmp的函数,但这显然不是编译时的事情。你看过相关的吗:-我在那里发布了我的答案,因为srgloureiroth OP特别要求使用Visual Studio 2010编译的解决方案
constexpr
是在C++11中引入的。Visual Studio 2010不支持C++11。
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
}