【问题标题】:Does C++/WinRT offer a helper function to construct a GUID from a string literal?C++/WinRT 是否提供帮助函数来从字符串文字构造 GUID?
【发布时间】:2021-04-08 22:35:55
【问题描述】:

与 C++/CX 不同,C++/WinRT 中似乎没有 GUID 的包装器类型。它只是按原样使用普通的 C GUID struct。所以构造初始化 GUID 的唯一方法是使用 aggregate initialization 语法,例如

GUID const guid{ 0x00000000, 0x0000, 0x0000,{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } };

虽然可行(并且 Visual Studio 中的 Create GUID 工具甚至可以设置为为您生成初始化程序代码),但它只是乏味、难以阅读,而且总是让我摸不着头脑我介绍了任何字节序问题。

我更喜欢写作(使用假设的make_guid 函数)

auto const guid{ make_guid("00000000-0000-0000-0000-000000000000") };

我知道 C++/WinRT 使用了很多 constexpr 魔法来根据完全限定的类型名称计算 GUID,因此大概可以实现零开销编译时间 make_guid 函数。浏览 documentationwinrt/base.h,我没有发现任何立即适用的内容。

C++/WinRT 是否提供帮助函数以在编译时从字符串文字构造 GUID?如果没有,我们/我可以拥有一个吗?

【问题讨论】:

  • 旧的 __uuidof() 扩展仍然存在,在 base.h 中被 guid 模板使用。您只需要__declspec(uuid("yadayada")) 告诉编译器它。如有必要,伪造一个结构。
  • 有一个例子right here.
  • @HansPassant:这不构成GUID。它将GUID 附加到一个类型,可以使用__uuidof 进行检索。这比使用聚合初始化更加冗长,并且引入了假类型。不完全是我想要的。
  • 确实如此,使用 guid 来检索它。如果您可以正确声明类型并推荐使用,那就太好了。但肯定没有必要,任何结构都可以。顺便说一句,你很挑剔。
  • 开发人员时间的第一大时间槽是阅读代码。对其他人必须阅读的代码进行挑剔是一项合理的投资。在这种特定情况下,在生成实现时似乎没有任何未解决的问题,简洁地传达了意图。另一方面,伪造类型实现了相反的效果:它引入了代码(其他人必须阅读),这对解决方案没有帮助。

标签: c++-winrt


【解决方案1】:

不,C++/WinRT 当前不提供这样的帮助程序。最初编写 constexpr GUID 代码时,C++ 编译器对 constexpr 的支持相当脆弱和缓慢。因此,我避免了任何不必要的计算。然而,对 constexpr 的支持已经有了很大的改进。无论如何,一个 constexpr make_guid 函数可以使用足够先进的编译器来实现。这是一个例子:

https://gist.github.com/kennykerr/6c948882de395c25b3218ad8d4daf362

【讨论】:

  • 毕竟没有太多魔法。是否有机会将其纳入 C++/WinRT 库,或者这不足以证明维护/支持成本的合理性?
  • 似乎是一个合理的补充。我会看看我能做什么。谢谢你的建议。 :)
  • sv 后缀可以从文字中省略。 make_guid("8AA90CAD-fed1-4c54-89db-9B7522D8AA92") 编译成功,更易阅读。
  • 嗨@KennyKerr。如果添加了该代码,您是否介意也添加一个 guid-to-string 助手?目前我发现的只是 Win32 函数 StringFromCLSID。我知道这没什么大不了的,但最好避免引入旧 API。
  • 实际上刮掉了那个功能。我正在使用你不能轻易与 StringFromCLSID 一起使用的 winrt::guid
【解决方案2】:

肯尼的回答很有帮助。我只是在 Windows 10 SDK 中添加一些 GUID 更新。

自 Windows 10 版本 1809 起,GUID 已投影为“winrt::guid”。它现在是 C++/WinRT 中的基本类型。这是release note on Docs

此外,还有一个帮助器可以从空构造 GUID。请参考以下链接: https://docs.microsoft.com/en-us/uwp/api/windows.foundation.guidhelper.createnewguid?view=winrt-19041

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多