cpphs处理Haskell CPP宏后代码位置偏移问题咨询
关于cpphs预处理Haskell文件的行号偏移问题解答
1. 这是预期行为吗?
这属于cpphs默认实现下的行为,但并非“符合预期的精准行号映射”。cpphs处理宏展开时生成的#line指令逻辑相对简单,不会像clang/GCC那样插入额外辅助#line指令来精准锚定原代码行位置;而逗号后的换行空白被丢弃,是cpphs默认压缩冗余空白的处理逻辑导致的。
2. 是否有未注意到的选项可插入line指令修正bar的位置?
cpphs有两个关键选项可以解决该问题:
- 启用
--line-directives=full:该选项会生成更详细的#line指令,更精准地映射原文件行号,避免偏移问题。 - 添加
--preserve-space:可以保留原文件中的空白(包括逗号后的换行),不会被预处理过程压缩丢弃。
将两个选项结合使用,就能修正bar的位置偏移,同时保留原文件的空白格式。
3. 是否有其他预处理器可通过line指令或其他方式保留bar的位置?
有两个更合适的替代方案:
- GCC/Clang的预处理器:直接使用
gcc -E或clang -E预处理Haskell文件,它们会生成更精细的#line指令,像你观察到的那样,通过插入额外指令精准固定原代码行位置,完美适配后续GHC的错误位置解析。 - GHC内置的预处理器:使用GHC自带的
-cpp选项进行预处理,它和GHC的错误报告系统深度适配,能原生保留原文件行号信息,不会出现位置偏移问题。
另外你提到的GHC结合cpphs时错误位置显示异常的问题,本质是cpphs生成的#line指令精度不足,导致GHC无法正确映射原代码行号,换成上述两种预处理器即可解决。
内容的提问来源于stack exchange,提问作者Jan Christiansen
相关产品推荐
相关产品推荐

