尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

rustc 错误码 E0765 详解:未终止的双引号字符串(unterminated double quote string)

发布时间:2026/9/10 17:41:55

资讯中心
01
ARTICLE

rustc 错误码 E0765 详解:未终止的双引号字符串(unterminated double quote string)

rustc 错误码 E0765 详解:未终止的双引号字符串(unterminated double quote string)
rustc 错误码 E0765 详解未终止的双引号字符串unterminated double quote string【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rustE0765 是 rustc 在词法分析lexing阶段报告的错误表示源码中出现了缺少右引号的普通字符串字面量。当编译器在文件结束EOF或语句结束处仍未找到闭合的双引号时就会以致命错误fatal error的形式中断编译。本文将结合 rustc 源码讲清 E0765 的触发条件、底层判定逻辑、修复方法以及与 E0762 / E0763 / E0766 / E0767 等兄弟错误码的关系帮助你快速定位并修复这类引号没闭合问题。错误信息与官方文档定义E0765 的官方描述来自错误码文档 compiler/rustc_error_codes/src/error_codes/E0765.mdA double quote string () was not terminated. 一个双引号字符串没有被终止。文档给出了最小复现用例let s ; // error!这段代码的问题在于字符串字面量从开头的开始但直到行尾都没有出现配对的闭合引号于是// error!中原本的注释符号//也失去意义——因为解析器仍处于字符串内部的状态整行都被当作字符串内容处理。修复方法就是在字符串末尾补上缺失的右引号let s ; // ok!值得一提的是文档中的compile_fail,E0765代码块标记本身就是一个编译测试指令rustc 的 UI 测试基础设施compiletest会实际编译这段示例并断言其产生 E0765 错误确保文档与编译器行为保持一致。所有错误码文档均由 src/tools/error_index_generator 汇总生成 rustc 的 Error Index 页面。源码定位E0765 在哪里产生E0765 并不是在类型检查或借用检查阶段发出的而是在**解析阶段的最前端——词法分析器lexer**中直接以致命错误抛出的。关键位置在 compiler/rustc_parse/src/lexer/mod.rsrustc_lexer::LiteralKind::Str { terminated } { if !terminated { self.dcx() .struct_span_fatal( self.mk_sp(start, end), unterminated double quote string, ) .with_code(E0765) .emit() } self.cook_quoted(token::Str, Mode::Str, start, end, 1, 1) // }这里有两个关键信息致命错误使用的是struct_span_fatal意味着一旦触发 E0765编译立即终止后续的解析、宏展开、类型检查等阶段都不会再执行。错误信息文本unterminated double quote string未终止的双引号字符串错误跨度span覆盖从字符串开始到词法分析停止位置通常是文件末尾的整个区间。词法层LiteralKind 如何标记终止状态判断字符串是否终止的工作发生在更底层的词法扫描器中。compiler/rustc_lexer/src/lib.rs 中定义了带terminated标志的字面量种类pub enum LiteralKind { Char { terminated: bool }, Byte { terminated: bool }, Str { terminated: bool }, ByteStr { terminated: bool }, CStr { terminated: bool }, // ... }普通双引号字符串的扫描逻辑位于 rustc_lexer/src/lib.rs 的double_quoted_string()方法/// Eats double-quoted string and returns true /// if string is terminated. fn double_quoted_string(mut self) - bool { debug_assert!(self.prev() ); while let Some(c) self.bump() { match c { { return true; } \\ if self.first() \\ || self.first() { // Bump again to skip escaped character. self.bump(); } _ (), } } // End of file reached. false }这段代码揭示了 E0765 的精确判定规则从开引号之后开始逐个字符推进遇到立即判定为终止terminated true遇到转义序列\\转义反斜杠或\转义引号时额外跳过一个字符保证\\\这类含转义引号的内容不会被误判为字符串结束一直推进到文件末尾EOF仍未遇到闭合引号返回false最终由rustc_parse层抛出 E0765。因此 E0765 的本质是扫描器在到达文件末尾时字符串字面量仍处于未闭合状态。触发场景与常见误写根据上述判定逻辑以下几种写法都会触发 E07651. 缺少结尾引号官方文档示例let s hello; // 错误缺右引号2. 引号配对数量不对let s abc; // 开头一个引号、结尾两个引号第二个 成了新的字符串开始这类代码通常会被继续解析出其他错误但首报错误往往是 E0765 或字符串字面量相关的歧义诊断。3. 多行字符串普通字符串字面量不允许包含未转义的换行。如果把一个跨多行的内容直接写进中扫描器不会因换行而提前终止换行在double_quoted_string中只是普通字符因此最终错误取决于文件后续是否还有闭合引号——若整段代码没有其他就会在文件末尾报告 E0765。4. 注释与字符串的边界混淆//只在字符串字面量之外才表示行注释。一旦进入未闭合的字符串注释标记也会被吞进字符串内容让错误更难肉眼发现。这是官方示例let s ; // error!想强调的坑点。修复方法最直接的修复是补上缺失的右引号let s ; // ok! 空字符串 let s hello; // ok! 普通字符串 let s line1\nline2; // ok! 用转义序列表示换行 let s 她说\你好\; // ok! 字符串内容包含引号时用 \ 转义如果希望字符串内容跨多行、避免大量\n转义应改用**原始字符串raw string**字面量r...或r#...#例如let s r第一行 第二行; // ok! raw string 允许直接换行需要注意的是原始字符串属于LiteralKind::RawStr见 rustc_lexer/src/lib.rs未闭合的 raw string 走的是另一条错误路径RawStrError::NoTerminator并不报 E0765。相关回归测试可见 tests/ui/parser/raw/issue-70677-panic-on-unterminated-raw-str-at-eof.rs 与 compiler/rustc_lexer/src/tests.rs 中的test_unterminated用例。相关错误码对照一个 match 分支家族E0765 并非孤立存在。在 rustc_parse/src/lexer/mod.rs 中各种引号字面量的未终止检查集中在同一个match分支里构成了完整的错误码家族错误码字面量种类错误文本示例E0762字符aunterminated character literallet c a;E0763字节常量baunterminated byte constantlet b ba;E0765字符串...unterminated double quote stringlet s abc;E0766字节字符串b...unterminated double quote byte stringlet s babc;E0767C 字符串c...unterminated C stringlet s cabc;其中 E0762 的分支还额外提供了智能修复建议当未终止的字符字面量恰好是某个生命周期lifetime时会给出multipart_suggestion提示你是否想写字符串字面量改用双引号见 rustc_parse/src/lexer/mod.rs。这类设计体现了 rustc 对常见误写的针对性诊断。错误上报之后从 token 到诊断值得补充的是E0765 走的是struct_span_fatal直接 emit 的路径错误一经产生编译即告终止。与之相对那些已正确终止的字符串会继续进入cook_quoted处理rustc_parse/src/lexer/mod.rs完成转义序列合法性检查如\x、\u{}等 unescape 校验、符号Symbol驻留与 token 构造。也就是说未终止→ 词法层致命错误 E0765编译中止已终止但转义非法→ 转义错误如\z等属于另一类诊断。理解这一分层有助于快速判断看到 E0765问题几乎必然出在引号没配对而不是转义或类型问题。小结E0765 是 rustc 词法分析阶段最容易理解也最常见的语法错误之一核心要点可概括为触发条件普通双引号字符串...在到达文件末尾时仍未找到闭合引号转义的\不计为闭合产生位置rustc_parse层词法器检查LiteralKind::Str { terminated }标志后以致命错误发出相关判定逻辑在rustc_lexer的double_quoted_string()修复手段补上右引号或改用原始字符串r...以支持直接换行家族关系与 E0762 / E0763 / E0766 / E0767 分别对应字符、字节、字节字符串、C 字符串的同类问题。错误码文档与编译器实现一一对应读者可结合 E0765.md、lexer 实现 与 rustc_lexer 扫描器 交叉阅读获得从报错现象到底层原理的完整认知。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。