相关文章推荐
豪情万千的橙子  ·  Mac ...·  1 年前    · 
唠叨的豆芽  ·  日常使用塑料安全吗?看清塑料制品上的“身份证 ...·  1 年前    · 
从容的莴苣  ·  何超琼已与许晋亨离婚 李嘉欣名正言顺嫁豪门?·  1 年前    · 
狂野的啤酒  ·  课程详细信息·  1 年前    · 
成熟的花卷  ·  《蜘蛛侠》3几时上映 ...·  2 年前    · 
Code  ›  【错误记录】C++ 字符串常量参数报错 ( 无法将参数 1 从“const char [4]”转换为“char *” | 从字符串文本转换将丢失 const 限定符 )开发者社区
https://cloud.tencent.com/developer/article/2376624
谦逊的毛豆
2 年前
韩曙亮

【错误记录】C++ 字符串常量参数报错 ( 无法将参数 1 从“const char [4]”转换为“char *” | 从字符串文本转换将丢失 const 限定符 )

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
韩曙亮
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 【错误记录】C++ 字符串常量参数报错 ( 无法将参数 1 从“const char [4]”转换为“char *” | 从字符串文本转换将丢失 const 限定符 )

【错误记录】C++ 字符串常量参数报错 ( 无法将参数 1 从“const char [4]”转换为“char *” | 从字符串文本转换将丢失 const 限定符 )

作者头像
韩曙亮
发布 于 2024-01-04 08:23:58
638 0
发布 于 2024-01-04 08:23:58
举报
文章被收录于专栏: 韩曙亮的移动开发专栏 韩曙亮的移动开发专栏

一、报错信息

定义了一个函数 , 接收 char* 类型的 字符串参数 ;

代码语言: javascript
复制
// 接收字符串参数并打印
void fun(char* str) {
	cout << str << endl;
}

如果传入一个字符串常量 , 如 “Hello” ,

代码语言: javascript
复制
	// 传入常量字符串
	fun("Hello");

完整代码如下 :

代码语言: javascript
复制
#include "iostream"
using namespace std;
// 接收字符串参数并打印
void fun(char* str) {
	cout << str << endl;
int main() {
	// 传入常量字符串
	fun("Hello");
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

报错信息 : 该报错是编译时报错 ;

Test.cpp(12,13): error C2664: “void fun(char *)”: 无法将参数 1 从“const char [6]”转换为“char *” Test.cpp(12,6): message : 从字符串文本转换将丢失 const 限定符(请参阅 /Zc:strictStrings) Test.cpp(5,6): message : 参见“fun”的声明

完整报错 :

代码语言: javascript
复制
已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(12,13): error C2664: “void fun(char *)”: 无法将参数 1 从“const char [6]”转换为“char *”
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(12,6): message : 从字符串文本转换将丢失 const 限定符(请参阅 /Zc:strictStrings)
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(5,6): message : 参见“fun”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
在这里插入图片描述
在这里插入图片描述

二、问题分析

该错误 只在 高版本的 Visual Studio 中出现 , 如 Visual Studio 2017 , Visual Studio 2019 或 更高版本 ;

在 Visual Studio 2013 中 , 不会报错 ;

在 下面的 fun 函数中 , 接收一个 char* 类型的 字符数组 / 字符串 ,

代码语言: javascript
复制
// 接收字符串参数并打印
void fun(char* str) {
	cout << str << endl;
}

如果调用时 , 传入 “Hello” 参数 , 这是 const char* 类型 , 二者的参数类型不匹配 ;

解决上述问题的思路 :

  • 修改 函数参数类型 ;
  • 修改 实参类型 ;
  • 设置 Visual Studio 编译环境的 兼容配置 ;

三、解决方案

1、设置 Visual Studio 的兼容规则

设置 Visual Studio 的兼容规则 :

右键点击 解决方案资源管理器 中的 解决方案 , 在弹出的菜单中选择 最后一项 属性 选项 ,

在这里插入图片描述
在这里插入图片描述

打开后 , 进入到 配置属性 / C/C++ / 语言 面板中 , 查看当前的 符合模式 配置 是 " 是(/permissive-) " ,

在这里插入图片描述
在这里插入图片描述

将 符合模式 的 配置 修改为 " 否 " ,

在这里插入图片描述
在这里插入图片描述

此时程序可以正常执行 :

在这里插入图片描述
在这里插入图片描述

2、修改实参类型 ①

函数接收 char* 类型的字符串 , 那么就传入 char* 类型的实参 , 不要传入 const char* 类型的字符串 ;

将 “Hello” 字符串常量 , 强制转为 char* 类型 , 如下代码示例 :

代码语言: javascript
复制
fun((char*)"Hello");

完整代码为 :

代码语言: javascript
复制
#include "iostream"
using namespace std;
// 接收字符串参数并打印
void fun(char* str) {
	cout << str << endl;
int main() {
	fun((char*)"Hello");
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行成功 :

在这里插入图片描述
在这里插入图片描述

3、修改实参类型 ②

将字符串放入 char 数组中 , 将 char 数组作为实参传递给函数 ;

代码语言: javascript
复制
	char str[8] = "Hello";
	fun(str);

完整代码示例 :

代码语言: javascript
复制
#include "iostream"
using namespace std;
// 接收字符串参数并打印
void fun(char* str) {
	cout << str << endl;
int main() {
	char str[8] = "Hello";
	fun(str);
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行成功 :

在这里插入图片描述
在这里插入图片描述

4、修改实参类型 ③

之前使用的是 C 语言中的强制类型转换 , 这里使用 C++ 中的强制类型转换 , 将 常量 转为 非常量 , 使用 const_cast 操作符进行转换 ,

代码语言: javascript
复制
fun(const_cast<char*>("Hello"));

完整代码示例 :

代码语言: javascript
复制
#include "iostream"
using namespace std;
// 接收字符串参数并打印
void fun(char* str) {
	cout << str << endl;
int main() {
	fun(const_cast<char*>("Hello"));
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行成功 :

在这里插入图片描述
在这里插入图片描述

5、修改形参类型

将 函数中的 char* 类型的形参 , 修改为 const char* 类型 , 也可以解决该问题 ;

完整代码示例 :

代码语言: javascript
复制
#include "iostream"
using namespace std;
// 接收字符串参数并打印
void fun(const char* str) {
	cout << str << endl;
int main() {
	fun("Hello");
 
推荐文章
豪情万千的橙子  ·  Mac 苹果电脑下载安装运行重返未来1999详细图文教程(IPA砸壳解密)-CSDN博客
1 年前
唠叨的豆芽  ·  日常使用塑料安全吗?看清塑料制品上的“身份证”_中国经济网��国家经济门户
1 年前
从容的莴苣  ·  何超琼已与许晋亨离婚 李嘉欣名正言顺嫁豪门?
1 年前
狂野的啤酒  ·  课程详细信息
1 年前
成熟的花卷  ·  《蜘蛛侠》3几时上映 3英雄无归国内上映时间_九游手机游戏
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号