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:))对,我认为谷歌不接受散列符号。不仅对调试器如此:它还帮助编译器向您指出错误的正确来源。