VS2019 错误C2440和E0144以及解决方法

本文针对VS2019编译器中出现的C2440&E0144错误进行了解析,详细介绍了错误原因在于字符串常量初始化字符指针变量时违反了C++标准。提供了两种解决方案,一是通过类型转换,二是调整编译器设置,避免在使用字符串初始化时触发此错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


错误:C2440&E0144

VS2019编译器使用字符串常量初始化字符指针变量,编译器报错
在这里插入图片描述

原因查找

  • 官方解释C2440错误:编译器错误C2440
  • 意思是:在 C 中,字符串文字的类型是数组char,但在C++,它是数组const char。如果严格按照C++标准,编译器选项设置了/zc: strictstrings,则编译器要求通过使用字符串文本初始化的指针符合严格的 const 限定。即不能像以上使用字符串常量初始化字符指针变量。

解决方案

  • 实施类型转换:将字符串常量类型从(const char*)强制转换为(char*),再初始化字符指针变量。此处类型转换有两种方法,如下:
    char* s = const_cast<char *>("my name is:");
    char* s1 = (char *)"鱼翔浅底zyx";
    cout << s << s1 << endl;

使用(char *)或者 const_cast 运算符。 const_cast 运算符在这里只是消除了const限定符,而不能改变 (char *) 类型,因此使用const限定符更加安全。

  • 改变编译器/zc: strictstrings设置,即编译器不强制实施标准C++ const通过使用字符串文本初始化的字符串指针的限定资格。通过查阅资料,发现有将编译器**/permissive-(标准符合性)**由 改为 的 ,这个设置只有2017版本以上的VS有,设置路径:项目->属性,在属性页做如下设置。
    在这里插入图片描述
    官方对 **/permissive-(标准符合性)**选项设置解释:/permissive。选择 则默认编译器符合编译器标准行为,如字符串文本的一致性,则编译器不严格执行标准。一致性的选项:/Zc(一致性)。所以选项 /permissive 改为否则以上选项均不严格执行标准一致性,而现在我们只是需要更改字符串文本一致性,即 /zc: strictstrings 选项。按照官方文档设置:
    在这里插入图片描述
    在这里插入图片描述
    在C/C++ —> 命令行里输入 /Zc:strictStrings- 命令即可关闭。
  • 第三只能通过字符数组存储字符串文本喽
char s[] = "my name";

学习字符串的第一行代码就那么艰辛,不过也借此熟悉了一下VS2019开发环境,应该不亏哈…

E0144错误是C语言编译器在编译过程中遇到的一种错误,通常是由于尝试将不兼容的类型赋值给变量引起的。具体来说,这种错误通常出现在以下几种情况: 1. **类型不匹配**:尝试将一种类型的值赋给另一种类型的变量。 2. **指针类型不匹配**:尝试将一种类型的指针赋给另一种类型的指针。 3. **函数返回值类型不匹配**:函数的返回类型与声明的返回类型不匹配。 ### 解决方法 1. **类型不匹配**: - 确保赋值操作的两边类型一致。例如,如果一个变量声明为`int`类型,那么赋给它的值也应该是`int`类型。 - 使用类型转换(强制类型转换)将一种类型转换为另一种类型。 ```c #include <stdio.h> int main() { int a = 5; double b = 3.14; // 错误的赋值 // a = b; // 可能会引发E0144错误 // 正确的赋值 a = (int)b; // 使用类型转换 printf("a = %d\n", a); return 0; } ``` 2. **指针类型不匹配**: - 确保指针类型一致。例如,`int*`类型的指针只能指向`int`类型的变量。 - 使用类型转换将一种指针类型转换为另一种指针类型。 ```c #include <stdio.h> int main() { int a = 5; double b = 3.14; // 错误的指针赋值 // int* p = &b; // 可能会引发E0144错误 // 正确的指针赋值 double* p = &b; int* q = (int*)&b; // 使用类型转换 printf("p = %p, *p = %f\n", (void*)p, *p); printf("q = %p, *q = %d\n", (void*)q, *q); return 0; } ``` 3. **函数返回值类型不匹配**: - 确保函数返回的类型与声明的返回类型一致。 - 使用类型转换将返回的值转换为声明的返回类型。 ```c #include <stdio.h> // 错误的函数声明 // int func() { // return 3.14; // 可能会引发E0144错误 // } double func() { return 3.14; } int main() { double a = func(); // 正确的赋值 // 使用类型转换 int b = (int)func(); printf("a = %f\n", a); printf("b = %d\n", b); return 0; } ``` ### 解释 E0144错误通常是由于类型不匹配引起的。通过确保赋值操作的两边类型一致,或者使用类型转换将一种类型转换为另一种类型,可以解决这种错误。指针类型不匹配函数返回值类型不匹配也可以通过类似的方法解决
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值