C++ “线”是什么意思?
下面这行是做什么的C++ “线”是什么意思?,c++,c-preprocessor,preprocessor-directive,C++,C Preprocessor,Preprocessor Directive,下面这行是做什么的 #line 25 "CSSGrammar.y" 和扩展是什么?< p>“YACC”分析器生成器消耗在.y中结束的文件,并发出包含C或C++的文件。它添加了这些#行,以允许调试器返回原始源代码,不接受替代代码。它只是说明当前代码行来自CSSGrammar.y的第25行,这是一个YACC风格的语法文件,生成此代码的地方 调试器可以使用它来逐步进入语法本身,而不是生成代码。这是一个c预处理器选项。它告诉c解析器放弃源文件的行计数,假装这是第25行 有了这些信息,您可以更轻松地调试
#line 25 "CSSGrammar.y"
和扩展是什么?< p>“YACC”分析器生成器消耗在.y中结束的文件,并发出包含C或C++的文件。它添加了这些#行,以允许调试器返回原始源代码,不接受替代代码。它只是说明当前代码行来自
CSSGrammar.y
的第25行,这是一个YACC风格的语法文件,生成此代码的地方
调试器可以使用它来逐步进入语法本身,而不是生成代码。这是一个c预处理器选项。它告诉c解析器放弃源文件的行计数,假装这是第25行
有了这些信息,您可以更轻松地调试源文件。yacc文件将被翻译成c源代码,其中这是假装的源代码行。根据标准: §16.4.3: 表单的预处理指令
# line digit-sequence new-line
# line digit-sequence " s-char-sequenceopt" new-line
# line pp-tokens new-line
使实现的行为就像以下源代码行序列从源代码行开始一样
具有由数字序列(解释为十进制整数)指定的行号的。如果数字
序列指定零或大于2147483647的数字,行为未定义
§16.4.4:
表单的预处理指令
# line digit-sequence new-line
# line digit-sequence " s-char-sequenceopt" new-line
# line pp-tokens new-line
以类似方式设置假定的行号,并将源文件的假定名称更改为内容
字符串文本的
§16.4.5:
表单的预处理指令
# line digit-sequence new-line
# line digit-sequence " s-char-sequenceopt" new-line
# line pp-tokens new-line
(与前两种形式中的一种不匹配)是允许的。行后的预处理标记
对指令的处理与在普通文本中一样(当前定义为宏名称的每个标识符都是
替换为预处理令牌的替换列表)。如果指令在所有替换后生成
不匹配前两种形式中的一种,行为未定义;否则,将处理结果
视情况而定
.y
扩展名正是作者选择使用的扩展名,也许是为了表明它是一个YACC文件(“语法”一词也指出了这一点,尽管它只是一个猜测)。它指示编译器相信下面的一行是文件CSSGrammar.y
中的第25行。然后,如果编译器在下一行的第2行检测到错误,它将被报告为来自CSSGrammar.y
生成C文件的程序,比如,或者yacc
,或者flex
,或者,甚至是(过时的)都会大量使用这种可能性
如果生成调试信息(例如使用gcc-g
),它将指向示例中的CSSGrammar.y
文件。\line指令修改编译器的报告位置,并由代码生成软件用于帮助程序员在原始源代码中识别问题。任何人都可以使用它来帮助重定向错误报告,使其更具信息性
<> P> >例如,你的解析器生成一个CSSGracMAR.CPP文件,它由C++编译器编译,并有C++片段,一个<代码>第25行“CSSGrammar .y”指令告诉C++编译器将文件中的特定点当作是CSSGrammar的第25行。
编译器将在该指令的初始条件下继续分析后续行并报告错误
因此,如果3行之后发生错误,它将报告CSSGrammar.y中的第28行发生错误
请注意,单个源文件可以包含来自多个部分的源文件;并且该指令可以非常有效地用于指示错误条件
通常情况下,您会看到沿途有多个#行指令;它们只是用来解释沿途的各种注射(如果愿意,可以重置报告插入符号)
请注意#line指令可由任何生成器(包括您自己的生成器)使用,并且不限于语法分析器生成器。使用#line会使编译器对编译的文件和所在的行产生健忘,并加载新数据
注意:编译器仍然从它所在的行编译
只是出于好奇。。。哪个编译器吃这个?@Vyktor它是标准的一部分我肯定这是重复的。看这个:Duuude。。。谷歌的第一个链接:@Vyktor:))对,我认为谷歌不接受散列符号。不仅对调试器如此:它还帮助编译器向您指出错误的正确来源。