为什么声明GUID的IsEqualGUID()和"operator =="返回int?

sha*_*oth 7 c++ com visual-c++

Windows SDK具有IsEqualGUID()函数和operator==()两个返回BOOL(相当于int)的GUID :

// Guiddef.h
#ifdef __cplusplus
__inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
{
    return !memcmp(&rguid1, &rguid2, sizeof(GUID));
}
#else   // ! __cplusplus
    #define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
#endif
//also in Guiidef.h
#ifdef __cplusplus
__inline int operator==(REFGUID guidOne, REFGUID guidOther)
{
    return IsEqualGUID(guidOne,guidOther);
}
#endif
Run Code Online (Sandbox Code Playgroud)

有什么意义int呢?我知道C没有bool数据类型,但是有一个#ifdef __cplusplus,所以这个代码只能编译为C++,所以bool无论如何都会支持.有一个否定接近memcmp()有效地将所有可能的值memcmp()转换为零和非零.

C中也没有用户定义的运算符 - 只有C++支持它们.所以operator==无论如何都不会用C代码编译.

有没有理由选择int而不是在bool这里?

In *_*ico 7

因为Windows API IsEqualGUID()作为返回的函数公开BOOL.他们需要保持稳定的界面.BOOLbool大小不同,以及Windows API的设计是用各种语言和编译器兼容.请记住,除了C++之外,还有其他语言可以与Windows API进行交互.

在C和C++上,IsEqualGUID()实现方式memcmp(),但IsEqualGUID()也实现ole32.dll.您可以从ole32.dll以下位置获取该功能:

REFGUID guid1 = IID_IUnknown;
REFGUID guid2 = IID_AsyncIUnknown;
typedef BOOL (WINAPI *IsEqualGUIDFuncType)(REFGUID, REFGUID);
HMODULE h = ::LoadLibrary("ole32.dll");
IsEqualGUIDFuncType f = reinterpret_cast<IsEqualGUIDFuncType>
    (::GetProcAddress(h, "IsEqualGUID"));
if(f != NULL)
{
    if(f(guid1, guid2) != 0)
        ::printf("true\n");
    else
        ::printf("false\n");
}
::FreeLibrary(h);
Run Code Online (Sandbox Code Playgroud)

所以,即使它在C++内联函数来实现,其他语言可以使用的DLL实现IsEqualGUID().C++版本返回一个BOOL与API一致的版本.