为什么 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
根据 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