名称含非字母字符的库,其MIN_VERSION_ℓib宏如何定义?
处理带连字符的Cabal包版本检查CPP宏问题
没错,你碰到的这个坑挺典型的——CPP宏的命名规则比Cabal包名严格得多,连字符-是不允许出现在宏名里的,所以直接写MIN_VERSION_quickcheck-instances(0,3,17)肯定会报错。
简单解决:把连字符换成下划线
Cabal在生成版本检查宏的时候,会自动把包名中的连字符替换成下划线。所以针对quickcheck-instances这个包,正确的宏名应该是MIN_VERSION_quickcheck_instances。
修正后的代码示例:
#if !MIN_VERSION_quickcheck_instances(0,3,17) instance Arbitrary SBS.ShortByteString where arbitrary = fmap SBS.pack arbitrary #endif
背后的小原理
所有Cabal预定义的MIN_VERSION_<pkgname>宏都会做这个字符转换:只要包名里有不符合CPP宏命名规范的字符(比如连字符),都会被替换成下划线。不管你遇到的是quickcheck-instances还是其他带特殊字符的包,都可以用这个规则来推导正确的宏名。
如果实在拿不准,还可以通过GHC的-E参数预处理代码,直接查看生成的宏定义,就能确认正确的宏名啦。
内容的提问来源于stack exchange,提问作者leftaroundabout
相关产品推荐
相关产品推荐

