代码之家  ›  专栏  ›  技术社区  ›  sharptooth

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

  •  7
  • sharptooth  · 技术社区  · 14 年前

    Windows SDK功能 IsEqualGUID() operator==() 两个返回的guid BOOL (相当于 int ):

    // 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
    

    这有什么意义 内景 ? 我知道C没有 bool #ifdef __cplusplus 周围,所以这个代码只编译为C++,所以 布尔 无论如何都将得到支持。否定的 memcmp() 有效地转换从 memcmp()

    此外,C语言中没有用户定义的操作符,只有C++支持它们。所以 operator==

    有什么理由选择吗 内景 而不是 布尔

    2 回复  |  直到 14 年前
        1
  •  8
  •   In silico    14 年前

    因为windowsapi暴露了 IsEqualGUID() 作为返回 BOOL . 他们需要保持一个稳定的接口。 布尔 bool

    关于C和C++, IsEqualGUID() 在以下方面实施 memcmp() ,但是 IsEqualGUID() 也在中实现 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);
    

    因此,即使它在C++中作为内联函数实现,其他语言也可以使用DLL实现。 IsEqualGUID() . C++版本返回 布尔

        2
  •  2
  •   utnapistim    14 年前

    而不是这里的布尔?

    原因可能不止一个:

    • 设计人员希望C和C++接口的一致性

    • 为了实现与C的互操作性,可能需要只使用C语言类型