QT使用MSVC编译时报错C2001: 常量中有换行符

QT使用MSVC编译时报错C2001: 常量中有换行符


Chapter1

原文链接:https://blog.csdn.net/qq_43521843/article/details/116864525

在新电脑做一个简单的Qt项目时,在debug输出的时候,出现了C2001错误,提示"常量中有换行符",

比如

cpp 复制代码
ui->pBtnStart->setText(tr("开始"));

就会出现常量中有换行符,肉眼确实没看出来...

但是

cpp 复制代码
ui->pBtnStart->setText(tr("停止"));

却可以顺利通过编译,试了很久改了编码也不行,即便编译通过界面显示却会乱码。

最后通过网上百度,找到了3种解决方式:

1、将字符中的中文字符用英文字母或单词代替,这样解决的好处是代码规范,语言统一,缺点就是没有中文表达那样直接、清晰。(如果是这样我就不会去用中文了!!!)

2、使用中文字符常量时,用QStringLiteral修饰中文字符,格式如QStringLiteral("中文字符"),这种方法必须在每次使用中文字符时都需要进行修饰,否则还是会出现错误,所以比较麻烦。

3、直接在头文件声明处添加 #pragma execution_character_set("utf-8"),直接解决此错误。

cpp 复制代码
#pragma execution_character_set("utf-8")

我采用了第3种方法,其步骤如下:

1、QT界面菜单栏->工具->选项->文本编辑器,修改成如果编码是UTF-8则添加,如图:


2、QT界面菜单栏->编辑->Slect Encoding...->UTF-8->按编码保存


3、在需要的头文件中加入#pragma execution_character_set("utf-8")即可

cpp 复制代码
#pragma execution_character_set("utf-8")

2023更新(非常重要):

出现这种情况的可能是在使用Qt的时候采用了msvc编译,源代码文件是无BOM的utf-8编码格式,QtCreator用MinGw编译OK,切换成MSVC后报错。有以下解决方法

1.直接换成MinGw编译或者在工程文件pro(MSVC编译器)添加条件编译

2.在工程文件pro添加以下代码,如图:

bash 复制代码
msvc {
    QMAKE_CFLAGS += /utf-8
    QMAKE_CXXFLAGS += /utf-8
}

特别注意:一旦在pro工程文件中添加了msvc编译条件 ,就不要再需要的头文件中添加#pragma execution_character_set("utf-8")这句话了,否则会编译失败。

3.再将工程编译结果清除,重新构建

总结

以下总结是经过上面在 QT5.15.2+MSVC2017 以及源文件格式是 UTF-8 这种前提下,对 MSVC 编译器在编译出可执行文件过程的思路总结

首先有一个前提,windows 下如果不设置 源字符集 和 执行字符集,默认都是 GBK

并且对于 UTF-8 文件而言,MSVC 编译器其实不能直接识别出文件类型来解析文件,所以使用默认本地字符集 GBK 作为源字符集来预处理文件,编译器会根据是否和 执行字符集 一致来决定生成可执行文件的过程中是否需要转码

UTF-8 带 BOM 的文件 MSVC 是可以识别出类型的,把文件当成 UTF-8 来处理。

所以不想出现乱码,这里分 2 种情况分别解释一下措施
源字符集 和 执行字符集 一致,就需要保证使用正确的 QString 接口来保证正确读取二进制数据

比如你文件编码是 VS 默认下的 GB2312,就应该使用 QString::fromLocal8bit()

如果你文件编码是 UTF-8,直接使用 QString() 即可

不一致,需要转码,那么就需要保证转码的过程没有错误

设置好 源字符集 保证代码不被编译器理解错误
执行字符集 设置的是 UTF-8 就使用 QString()
执行字符集 设置的是 GBK 就使用 QString::fromLocal8bit()

其实我的建议是在 windows 下:

source-charset 根据实际文件格式设置好

execution-charset 根据代码中的调用 QString 具体哪种方法也设置好,而且方法也需要统一了。

原文链接:https://blog.csdn.net/qq_20821119/article/details/120170353

Chapter2 qt彻底解决msvc乱码:配置pro文件

推荐在pro中添加以下3条指令,不管带不带bom都能解决常见的编码问题

即彻底解决C4819警告,C2001错误而不需要转换编码,不需要修改源码!!!

bash 复制代码
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8
QMAKE_CXXFLAGS_WARN_ON += -wd4819
相关推荐
DokiDoki之父3 分钟前
多线程—飞机大战排行榜功能(2.0版本)
android·java·开发语言
高山上有一只小老虎9 分钟前
走方格的方案数
java·算法
whatever who cares10 分钟前
Java 中表示数据集的常用集合类
java·开发语言
秋千码途1 小时前
一道同分排名的SQL题
数据库·sql
JavaArchJourney1 小时前
TreeMap 源码分析
java
whitepure1 小时前
万字详解Java中的IO及序列化
java·后端
还梦呦1 小时前
2025年09月计算机二级Java选择题每日一练——第一期
java·开发语言
与火星的孩子对话1 小时前
Unity高级开发:反射原理深入解析与实践指南 C#
java·unity·c#·游戏引擎·lucene·反射
花开富贵ii2 小时前
代码随想录算法训练营四十六天|图论part04
java·数据结构·算法·图论
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法