带有两个反斜杠的行如何欺骗C预处理器?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (27)

我决定看一看标准Haskell模块Data.List的来源,发现一些有趣的东西。该代码显然首先由C预处理器处理,如同一堆#ifdefs的建议,并且只有在Haskell编译器编译之后。但是,正如文档中指出的那样,C预处理器对于与C本身不同的源代码不是很友好:

C预处理器仅用于C,C ++和Objective-C源代码。过去,它被滥用作为一般的文本处理器。它会窒息不符合C的词汇规则的输入。例如,撇号将被解释为字符常量的开始,并导致错误。而且,您不能依赖它来保留对C族语言不重要的输入的特征。如果一个Makefile被预处理,所有的硬标签将被删除,而Makefile将不起作用。

但是Haskell代码在C预处理下仍然保留下来?可能这个片段给出了一个线索:

#ifdef __GLASGOW_HASKELL__
import GHC.Num
import GHC.Real
import GHC.List
import GHC.Base
#endif

infix 5 \\ -- comment to fool cpp

-- -----------------------------------------------------------------------------
-- List functions

这是如何comment to fool cpp工作的?它对C预处理器有什么作用,它实际上是“被欺骗”的?

提问于
用户回答回答于

如果你简单地说:

infix 5 \\

当行位于文件末尾时,C预处理器发出以下消息:

infix 5 \foo.c:8:10: warning: backslash-newline at end of file

如果它不在文件的末尾(谢谢@注释),它只是“吃掉”一个反斜杠(将它与下面的换行符相关联),并且输出在Haskell端是不正确的:

infix 5 \

但是,如果之后添加了Haskell类型的注释,则Haskell将忽略它(显然!),这对于C预处理器来说并不是一个问题,因为\不在行尾:

infix 5 \\ -- comment

CPP发布完全相同的文本,Haskell可以解析有趣的部分,去掉-注释。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问6 回答
  • 人生的旅途

    10 粉丝484 提问5 回答
  • 找虫虫

    0 粉丝0 提问5 回答
  • 不吃貓的鱼oo

    4 粉丝466 提问4 回答

扫码关注云+社区

领取腾讯云代金券