为什么 MIN_VERSION_GLASGOW_HASKELL 在 GHC 9.2 中不起作用?

Why does MIN_VERSION_GLASGOW_HASKELL not work in GHC 9.2?

根据 GHC guide,我们希望 MIN_VERSION_GLASGOW_HASKELL(x,y,z,z') CPP 在相应的 GHC 版本上工作。但是,以下无法在 GHC 9.2

上编译
#if MIN_VERSION_GLASGOW_HASKELL(9,2,1,0)

这里发生了什么?


为了解决这个问题,我发现自己使用:

#if MIN_VERSION_base(4,16,0)

但为什么 MIN_VERSION_GLASGOW_HASKELL 不起作用?

GHC 版本由主要版本、次要版本、第一补丁级别和可选的第二补丁级别组成。所以 GHC 9.2.1 有主要的 9,次要的 2,第一个补丁级别 1,没有第二个补丁级别。

GHC 中有一个错误,可能自引入宏 MIN_VERSION_GLASGOW_HASKELL 以来就存在,其中该宏依赖于一个宏变量 __GLASGOW_HASKELL_PATCHLEVEL2__,该变量在发行版本中通常没有定义,GHC 版本只有一个补丁级别(如 9.2.1)。

这通常无关紧要,除非 -Wcpp-undef 标志有效 AND 测试是在与主要、次要、和第一个补丁级别。然后,对第二个补丁级别的检查将生成一条编译器警告消息。 (尽管它看起来像是“错误”而不是警告,但编译似乎已完成。)

您可以通过以下方式解决此问题:

  • 忽略它——不管表面如何,它看起来只是一个警告,而不是错误,编译应该完成

  • 通过删除标志或在可行的情况下添加 -Wno-cpp-undef 标志来关闭 -Wcpp-undef

  • 在调用宏之前添加一些代码来定义缺失的补丁级别:

     #ifndef __GLASGOW_HASKELL_PATCHLEVEL2__
     #define __GLASGOW_HASKELL_PATCHLEVEL2__ 0
     #endif