Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不推荐从字符串常量进行转换。到wchar\t*_C++_Deprecated_Wchar T - Fatal编程技术网

C++ 不推荐从字符串常量进行转换。到wchar\t*

C++ 不推荐从字符串常量进行转换。到wchar\t*,c++,deprecated,wchar-t,C++,Deprecated,Wchar T,您好,我有一个pump类,它需要使用一个成员变量,该变量是指向包含端口地址即“com9”的wchar\t数组的指针 问题是,当我在构造函数中初始化这个变量时,我的编译器会标记一个贬值的转换警告 pump::pump(){ this->portNumber = L"com9";} 这很好,但每次编译时都会出现警告,让我觉得自己做错了什么 我尝试创建一个数组,然后像这样设置成员变量: pump::pump(){ wchar_t port[] = L"com9"; this-

您好,我有一个pump类,它需要使用一个成员变量,该变量是指向包含端口地址即“com9”的wchar\t数组的指针

问题是,当我在构造函数中初始化这个变量时,我的编译器会标记一个贬值的转换警告

pump::pump(){
   this->portNumber = L"com9";}
这很好,但每次编译时都会出现警告,让我觉得自己做错了什么

我尝试创建一个数组,然后像这样设置成员变量:

pump::pump(){
   wchar_t port[] = L"com9";
   this->portNumber = port;}
但出于某种原因,这使得我的端口号指向“F”

显然,这是我的另一个概念问题

谢谢你帮我解答我的问题

编辑:

根据要求,portNumber的定义为:

    class pump
{
private:
   wchar_t* portNumber;
}
由于有了答案,现在已将其更改为:

    class pump
{
private:
   const wchar_t* portNumber;
}

如果
portNumber
wchar\u t*
,则它应该是
const wchar\u t*

字符串文本是不可变的,因此元素是
const
。存在从字符串文字到非常量指针的不推荐转换,但这很危险。进行更改以保持类型安全,而不是使用不安全的转换

第二个失败,因为您指向局部变量的内容。当构造函数完成时,变量消失,您指向的位置无效。使用它会导致未定义的行为

最后,使用初始化列表:

pump::pump() :
portNumber(L"com9")
{}

初始化列表要初始化,构造函数要完成构造。(也,<代码> ->>代码>对于几乎所有C++用户来说都是丑陋的;它不是好的和冗余的。)< /P> < P>使用<代码> const WCARUT**/COD>指向一个文字。< /P> 存在转换的原因是,从早期版本的C开始,将字符串文字分配给非常量指针[*]是有效的。不推荐使用它的原因是,修改文本是无效的,使用非常量指针引用不能修改的内容是有风险的


[*]C最初没有
const
。当添加
const
时,显然它应该应用于字符串文本,但在
const
存在之前就已经有了编写的代码,如果突然将
const
洒到任何地方,代码就会断开。今天,我们仍在为语言的突破性变化付出代价。由于它是C++,所以它甚至不是对这种语言的一种突破性改变。

显然,<代码> PosithNo.<代码>是<代码> W查尔特T*< /Cord>(非const),对吗?如果是:

  • 第一个是错误的,因为字符串文字是只读的(它们是指向通常存储在可执行文件的字符串表中的字符数组的常量指针,该数组映射到内存中的某个位置,通常在只读页中)。
    IIRC批准了对非常量
    char
    s/
    wchar\u t
    s的丑陋的隐式转换,以实现与
    const
    甚至不存在时编写的旧代码的兼容性;可悲的是,它让许多不知道常量正确性意味着什么的白痴逃脱了编写要求非常量指针的代码的惩罚,即使常量指针是正确的选择

  • 第二个是错误的,因为您正在使
    portNumber
    指向堆栈上分配的变量,该变量在构造函数返回时被删除。构造函数返回后,存储在
    portNumber
    中的指针指向随机垃圾


正确的方法是将
portNumber
声明为
const wchar\t*
,如果它不需要修改的话。相反,如果它确实需要在类的生命周期内进行修改,通常最好的方法是完全避免使用C样式的字符串,只需添加一个
std::wstring
,它将处理与字符串相关的所有簿记。

向我们展示
pump::portNumber
的定义。谢谢您提供的信息。在这种情况下,端口号可能会动态更改(从下拉菜单),因为泵可能并不总是在com9上。我之所以使用wchar\u t指针,是因为它是CreateFile()函数中必需的参数。我将查看它是否接受了STD::WSTRing。它不接受WString,但是WString(如STD::Basic字符串)上的任何字符串提供了返回一个const WCARGURT*的CyString()方法,让C++函数访问它的内容。(包括标准图书馆)。如果portNumber的定义因为是第三方代码的一部分而无法更改,该怎么办?我似乎无法让警告消失,因为我不知道如何告诉编译器不要生成文字。@MikeVersteeg:如果您无法更改代码,您唯一的选择就是尝试并抑制警告。好吧,大多数编译器都有方法来消除警告使用pragma禁用和重新启用警告-您可以禁用
#include
之前的警告,并在之后重新启用。谢谢,但这在C++11编译器(至少不是我的编译器)中已不可能了。我确实通过动态创建字符串并使用它解决了这个问题。从这篇文章中学到了很多。