常量中有换行符怎么处理?教你几种简单有效的写法!

吉云

今天搞代码的时候,碰到个挺烦人的问题,编译器老是提示“常量中有换行符”。一开始我有点懵,这啥意思?常量?换行符?我寻思我也没在常量里瞎按回车。

问题咋出现的

是这么回事,我当时在写一段代码,里面需要定义一个比较长的字符串。为让代码看着整齐点,我就很自然地在字符串中间敲个回车,想让它分成两行显示。就像这样:

常量中有换行符怎么处理?教你几种简单有效的写法!

const char my_string = "这是一段非常非常长的文字,我想让它在这里

换个行继续写。";

结果,一编译,好家伙,直接报错:“常量中有换行符”。编译器直接指着我敲回车的那一行。

开始瞎捣鼓

第一反应: 是不是不能直接在引号里回车?好像有点印象。那我试试把字符串拆开,用加号连起来?或者干脆写成两行,让编译器自己拼?

    常量中有换行符怎么处理?教你几种简单有效的写法!

  • 试拆成两个字符串用 C++ 的自动拼接特性(就是两个引号放两行),比如: const char my_string = "这是一段非常非常长的文字,我想让它在这里"

    "换个行继续写。";

    编译,这个简单情况下的报错没!看来直接在引号里敲回车确实不行。

  • 后来又遇到一次,这回是复制粘贴一段包含特殊字符或者中文的文本,也报这个错。这就怪,我明明没在字符串里手动换行。

常量中有换行符怎么处理?教你几种简单有效的写法!

深究一下,发现编码问题

再次排查: 我仔细看报错的那几行代码,没发现啥明显的换行。但是,那段代码里包含一些中文字符。我就琢磨,会不会是编码格式的问题?之前好像也遇到过类似的情况,特别是用某些编辑器或者在 Windows 下用 MSVC 编译器的时候。

我想起来之前看到过,有些编辑器默认保存成 UTF-8 格式,但可能没带那个叫 BOM 的东西。据说有时候编译器(尤其是老一点的或者某些特定的,比如 MSVC)会认不出来,把多字节字符的某个部分错误地识别成换行符之类的控制字符。

动手解决:

  1. 我用我的代码编辑器(比如 VS Code 或者 Notepad++)打开那个报错的源文件。
  2. 常量中有换行符怎么处理?教你几种简单有效的写法!

  3. 看下右下角或者文件菜单里的编码格式,确实是 UTF-8。
  4. 我找到“以带 BOM 的 UTF-8 编码”或者类似的选项来保存文件。具体操作就是“文件” -> “另存为”,然后在编码选项里选那个带 BOM 的 UTF-8。
  5. 保存之后,回去重新编译我的项目。

结果成

编译通过! 这回顺利编译通过,那个“常量中有换行符”的错误提示再也没蹦出来。看来,有时候这个问题不光是字符串本身写得不对,还可能是文件编码格式跟编译器“八字不合”。

常量中有换行符怎么处理?教你几种简单有效的写法!

以后再碰到这个报错:

  • 先检查字符串常量是不是真的在引号里直接敲回车换行,如果是,改成合法的多行写法(比如拆开字符串或者用 C++11 的原始字符串字面量 R"()")。
  • 如果字符串写法没问题,特别是代码里有中文或者其他非 ASCII 字符的时候,就去查查源文件的编码格式,试试保存成带 BOM 的 UTF-8 格式。

搞定收工,又解决一个小麻烦,记录一下,免得下次又踩坑。

常量中有换行符怎么处理?教你几种简单有效的写法!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]