【问题标题】:compile time windows version wishful thinking编译时windows版一厢情愿
【发布时间】:2018-12-27 22:18:32
【问题描述】:

为了准确地展示我想要的东西,基本上我已经从here 中获取了代码,并将其转化为如下的一厢情愿:

int wmain( int argc, PCWSTR argv[] )
{
    UNREFERENCED_PARAMETER(argc);
    UNREFERENCED_PARAMETER(argv);

    if constexpr (IsWindowsXPOrGreater())
    {
        printf("XPOrGreater\n");
    }
    else if constexpr (IsWindowsXPSP1OrGreater())
    {
        printf("XPSP1OrGreater\n");
    }
    else if constexpr (IsWindowsXPSP2OrGreater())
    {
        printf("XPSP2OrGreater\n");
    }
    else if constexpr (IsWindowsXPSP3OrGreater())
    {
        printf("XPSP3OrGreater\n");
    }
    else if constexpr (IsWindowsVistaOrGreater())
    {
        printf("VistaOrGreater\n");
    }
    else if constexpr (IsWindowsVistaSP1OrGreater())
    {
        printf("VistaSP1OrGreater\n");
    }
    else if constexpr (IsWindowsVistaSP2OrGreater())
    {
        printf("VistaSP2OrGreater\n");
    }
    else if constexpr (IsWindows7OrGreater())
    {
        printf("Windows7OrGreater\n");
    }
    else if constexpr (IsWindows7SP1OrGreater())
    {
        printf("Windows7SP1OrGreater\n");
    }
    else if constexpr (IsWindows8OrGreater())
    {
        printf("Windows8OrGreater\n");
    }
    else if constexpr (IsWindows8Point1OrGreater())
    {
        printf("Windows8Point1OrGreater\n");
    }
    else if constexpr (IsWindows10OrGreater())
    {
        printf("Windows10OrGreater\n");
    }
    else if constexpr (IsWindowsServer())
    {
        printf("Server\n");
    }
    else
    {
        printf("Client\n");
    }
}

目标显然是拥有标准 C++ 代码,使用 constexpr-if 和 windows 版本编译时间检测。 VersionHelpers.h 中都有,但不是编译时 C++17。

来自VersionHelpers.h 的函数不返回 constexpr 值。问题是是否有人做过这样的事情?或者不同的实现来实现相同的目标?

【问题讨论】:

  • 那么,您想检测您正在构​​建的计算机是某个版本还是您正在运行的计算机?因为后者是不可能做编译时的。
  • related/dupe: stackoverflow.com/questions/10112051/… 您可以使用链接中提供的信息来编写您自己的版本。
  • constexpr-if 需要编译时间值,然而这个显然误解了这个 C++ 特性的“草帽鸡”却得到了 +2?我得到-2(到目前为止),我假设来自其他一些鸡......
  • 最简单且通常最省力的方法是将自己限制在您计划支持的最旧操作系统版本中存在的 API 工具上。以我的经验,这不会显着限制您的能力,除非在某些边缘情况下,例如复杂的控制台 UI。 Microsoft 的文档对此非常有用,因为它清楚地指出了支持的最低版本。

标签: c++ windows c++17


【解决方案1】:

这基本上是不可能的。

虽然库/操作系统版本有时会对部署施加实际限制,但编译器通常针对架构,而不是操作系统

如果您在计算机 A 上构建代码,编译器如何知道运行编译程序的计算机 B 的操作系统?

所以这就是没有一个是 constexpr 的原因之一。

Here's an exploration 的更多运行时途径。

【讨论】:

  • 谢谢,但是...constexpr-if 需要编译时间值。编译发生在计算机 A 上,我只关心计算机 A,而不关心 B ..就像 __FILE__ 在编译时间之前被替换为文件名 aka 编译单元,我看不出我们不能拥有的根本原因(例如) __OS__ 预定义宏。这基本上是可能的。只要编译器能够提供它。就像任何其他预定义的宏一样。
  • @Chef Right,这就是为什么你不能使用if constexpr 来处理这些数据。在选择一些编译时数据时,确定 build 系统使用哪个操作系统有什么价值?那不是传统的模型。同样,也许您选择只部署到构建程序的同一台计算机上,但 C++ 不知道这一点,Microsoft 也不知道。您可以尝试通过宏从您的构建系统传递这些信息——这可能是您唯一的机会。
  • 完全正确。我可以编写一个脚本或 ide 宏,在编译开始之前引入操作系统版本号。它仅适用于 Windows,它将使用“操作系统”envvar 生成 MS 为 Win 版本编号定义的“标准”常量之一。我认为这没有根本性的障碍。再次感谢您的讨论。
  • @ChefGladiator 麻烦在于,一旦您将该 .exe 移至另一台计算机,取决于您对该信息的处理方式,结果可能几乎是任何东西。这确实不是一个好主意。
  • @ChefGladiator 或者让它可移植,这样就没有关系,然后客户永远是对的,你的软件也永远是对的。我认为我从未见过必须为 Win7 和 Win10 下载不同版本的软件,这是有充分理由的。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2011-04-05
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多