gpt4 book ai didi

c - #line - 目的?

转载 作者:太空狗 更新时间:2023-10-29 17:04:46 28 4
gpt4 key购买 nike

不幸的是,我今天做了一些代码考古(同时重构了一些旧的危险代码)并发现了这样的小化石:

# line 7 "foo.y"

能在里面找到如此古老的宝藏,我完全惊呆了。我在 C 编程的网站上阅读了它。然而,它并没有解释为什么有人会想要使用它。因此,我只能自己猜测,程序员将其放入纯粹是为了向编译器撒谎。

注意:(请注意,化石实际上位于 cpp 文件的第 3 行)(哦,该文件确实指向与该文件几乎相同的 .y 文件。

有谁知道为什么需要这样的指令?或者它可以用来做什么?

最佳答案

它通常被自动代码生成工具(如 yaccbison)用来将行号设置为实际源文件中行的值,而不是C 源文件。

这样,当您收到错误消息时:

a += xyz;
^ No such identifier 'xyz' on line 15 of foo.y

您可以查看实际源文件的第 15 行以查看问题。

否则,它会说一些荒谬的事情,例如 No such identifier 'xyz' on line 1723 of foo.c 并且您必须在自动生成的 C 中手动关联该行> 使用真实文件中的等效文件。相信我,除非你想深入了解词法和语义分析的内部结构(或者你想脑出血),否则你不会想通过 yacc 生成的代码(bison 可能会生成更好的代码,我不知道,但我也不在乎,因为我编写了更高级别的代码)。

根据 C99 标准,它有两种形式:

#line 12345
#line 12345 "foo.y"

第一个只设置报告的行号,第二个也更改报告的文件名,所以你可以在 foo.y 而不是 foo.c< 的第 27 行得到错误.


至于“程序员纯粹是为了向编译器撒谎的纯粹乐趣”,没有。我们可能会弯曲和扭曲,但我们通常不是恶意的 :-) 该行是由 yaccbison 本身放在那里的,目的是帮您一个忙。

关于c - #line - 目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428758/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com