2011-08-18 85 views
4

我想了解一些代码,我碰到过一个我从未见过的关键字。我试图谷歌它,但还没有发现任何关于它。#line关键字在C

char *valtext; 
#line 1 "Values.l" 
#define INITIAL 0 
#line 2 "Values.l" 
int reserve(char *s); 
#line 388 "lex.val.c" 

我已经包括整个块希望也许有人可以帮助我理解这块代码。我在我的系统上找不到任何名为“Values.l”的文件,这段代码位于“lex.val.c”文件中。

在此先感谢。

+0

这似乎解释它:http://msdn.microsoft.com/en-us/library/34dk387t(v=vs.80).aspx(刚才意识到你问的关于C而不是C#所以这可能会或可能不会适用毕竟) – sellmeadog

+0

请参阅http://msdn.microsoft.com/en-US/library/b5w2czay%28v=VS.80%29.aspx –

+0

是的,谷歌搜索“行”isn这不会很有用,是吗? –

回答

4

#line指令是一种使用预处理器,使所述源的原来行号可被传递到C编译器。它使得来自编译器的错误消息正确地引用用户将理解的行号。

例如,mycode.c的第12行可能会经过预处理器,现在是mycode.tmp.cc的第183行。如果C编译器在该行发现错误,则不希望被告知错误位于mycode.tmp.cc的第183行。所以C编译器需要给出每行的“原始坐标”。 #line指令执行此操作,告诉编译器当前行号和文件名在错误消息中使用。

0

该代码已通过预处理器,因此被编译器的一个阶段标记,旨在被相同编译器的另一个阶段使用。它使用的功能不适合您的使用。

它引用的文件可能是编译器在运行时创建的临时文件。

+1

通常'#line'指令引用的文件是原始源文件。重点是*避免*引用临时文件。如果你有一个工具可以从其他输入文件生成(临时)C源代码,那么使用'#line'是完全合理的; lex/flex和yacc/bison这样做。但出于更多目的,您可以忽略它。 –

+0

我刚才说过,因为他说他没有“Values.l”。仔细查看这个问题,'Values.l'显然是一个通过运行'lex'创建的文件 - 事实上,这是一个他正在查看的'lex.yy.c'文件! –

0

这样做是为了使the line number changes

这样做是为了显示Lex输入文件的行号,例如错误消息和警告。由于Lex生成C代码,没有#line指令编译错误,警告不会有任何价值。

9

A #line指令设置编译器对当前文件名和行号的设置。这会影响__FILE____LINE__符号,失败的assert()生成的输出以及诊断消息(错误和警告)。它通常由预处理器使用,以便错误和警告消息可以引用原始源代码,而不是预处理器的输出(在您看到任何消息时通常会丢弃)。

它也被生成C源代码的其他工具(如lex/flex和yacc/bison)使用,以便错误消息可以引用输入文件而不是(临时)生成的C代码。

权威性的参考文献是the C standard(pdf),第6.10.4节。

形式

#line number 

的行设置当前行号。格式为

#line number "file-name" 

设置行号和文件名。你也可以通过宏扩展生成这两种形式之一;例如:

#define LINE 42 
#define FILE "foo.c" 
#line LINE FILE