【问题标题】:How does gcc know where the source is coming from?gcc 如何知道源代码来自哪里?
【发布时间】:2012-01-19 08:08:05
【问题描述】:

我今天在玩 flex 和 bison,但有些奇怪的东西引起了我的注意。

localhost:c math4tots$ lex c.l
localhost:c math4tots$ yacc -d c.y
localhost:c math4tots$ rm c.l c.y
localhost:c math4tots$ gcc c.c lex.yy.c y.tab.c
c.y: In function ‘opr’:
c.y:120: error: ‘nodeType’ has no member named ‘oper’

我只通过了 c.c lex.yy.c 和 y.tab.c(c.h 和 y.tab.h 也包含在标题中),但 gcc 不知何故知道 c.l 和 c.y。事实上,即使在我删除了 c.l 和 c.y 之后,gcc 也知道代码中的错误在 c.y 的哪个位置。它是怎么做到的?

我觉得我在过去使用过的一些不同工具中看到过类似的东西,但我不记得它们是什么了。

【问题讨论】:

  • 您应该始终将-Wall 传递给您的 GCC 编译器,并改进您的代码,直到不再收到警告为止。

标签: gcc bison yacc lex flex-lexer


【解决方案1】:

您会在文件中找到一些标记,如下所示:

#line 75 "c.y"

正是用于此目的,能够针对生成您正在编译的实际文件的原始文件报告错误消息或警告。

基本上这样您就不必去c.c 文件并尝试找出您必须修复的c.y 文件中的等效行。

从这个意义上说,C 文件与目标文件没有什么不同。你不关心里面有什么,因为它是自动生成的。如果有问题,你希望能够直接回到c.y中的正确行,并在源头上修复它。

【讨论】:

    【解决方案2】:

    生成的C文件有一些line control preprocessor directives(也生成)之类的

     #line 119 "c.y"
    

    然后编译器认为该指令之后的下一行在文件 c.y 的第 119 行并相应地计算以下位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多