错误: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开发环境,应该不亏哈…