C++ 禁用警告“;不推荐将字符串常量转换为';字符*';[-Wwrite strings]”;

C++ 禁用警告“;不推荐将字符串常量转换为';字符*';[-Wwrite strings]”;,c++,gcc,mingw32,string-literals,C++,Gcc,Mingw32,String Literals,我的代码中有以下两行: RFM2G_STATUS result; result = RFM2gOpen( "\\\\.\\rfm2g1", &rH ); 我收到错误消息: "warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] result = RFM2gOpen( "\\\\.\\rfm2g1", &rH );" 事实上,我无法将其修改为 cons

我的代码中有以下两行:

RFM2G_STATUS   result;   
result = RFM2gOpen( "\\\\.\\rfm2g1", &rH );
我收到错误消息:

"warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
     result = RFM2gOpen( "\\\\.\\rfm2g1", &rH );"
事实上,我无法将其修改为

const RFM2G_STATUS   result;   

因为
RFM2G\u STATUS
是在另一个文件中预定义的,并且之前不接受const。是否有其他方法来禁用此警告消息?

您似乎绝对确定
RFM2gOpen
不会修改输入字符串,否则您的代码中会有未定义的行为

如果您确定不会写入输入数据,则可以安全地将常量抛出:

result = RFM2gOpen(const_cast<char*>("\\\\.\\rfm2g1"), &rH );
result=RFM2gOpen(const\u cast(\\\\.\\rfm2g1”),&rH);
同样,只有当例程不写入输入字符串时,这才是安全的,否则这是未定义的行为


如果您不能完全确定此方法永远不会写入字符数组,请将字符串复制到
std::vector
并将
.data()
指针传递到函数(或者使用简单的
char
数组,这很可能比
vector
更有效/更合适)

如果您确定不会写入输入数据,则可以安全地将常量抛出:

result = RFM2gOpen(const_cast<char*>("\\\\.\\rfm2g1"), &rH );
result=RFM2gOpen(const\u cast(\\\\.\\rfm2g1”),&rH);
同样,只有当例程不写入输入字符串时,这才是安全的,否则这是未定义的行为

如果您不能完全确定此方法永远不会写入字符数组,请将字符串复制到
std::vector
并将
.data()
指针传递到函数(或者使用简单的
char
数组,这很可能比
vector
更有效/更合适).

一种可能的修复方法是:

RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH);
要完全一致,需要将“\。\rfm2g1”复制到可变缓冲区。比如:

char *s = alloca(strlen("\\.\rfm2g1")+1);
strcpy(s, "\\.\rfm2g1");
RFM2gOpen(s, &rH);
当然,真正的解决方案是更新
RFM2gOpen
以获取
const char*

一个可能的解决方案是:

RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH);
要完全一致,需要将“\。\rfm2g1”复制到可变缓冲区。比如:

char *s = alloca(strlen("\\.\rfm2g1")+1);
strcpy(s, "\\.\rfm2g1");
RFM2gOpen(s, &rH);

当然,真正的解决办法是更新
RFM2gOpen
以获取
const char*

函数
RFM2gOpen()
似乎期望一个非const
char*
作为第一个参数(),这有时会发生在遗留API(或由懒惰的程序员编写的API)上,字符串literal的类型为
const char*
因此,出现了一个不推荐使用的隐式转换(去掉常量限定符)


如果您*100%确定该函数不会修改指向内存的值,那么也只有这样,您才能进行显式转换,例如
const\u cast(“\\\\\\.\\rfm2g1”)
或(C-style)
(const char*)“\\\\.\\rfm2g1”

该函数似乎是
RFM2gOpen()
需要一个非常量的
char*
作为第一个参数(),因为它有时会发生在遗留API(或由懒惰的程序员编写的API)中,而字符串literal的类型为
const char*
因此,出现了一个不推荐使用的隐式转换(去掉常量限定符)


如果您*100%确定函数不会修改指向内存,那么也只有这样,您才能进行显式转换,例如
const\u cast(“\\\\\.\\rfm2g1”)
或(C-style)
(const char*)“\\\\.\\rfm2g1”

,如消息所述,从
const char*
转换为
char*
(古C语言中没有继承的< C++ >代码> >代码>已被禁止。

为了避免这种情况,可以将参数存储在非常量字符串中,并将其传递给函数:

char parameter[] = "\\\\.\\rfm2g1";
RFM2G_STATUS   result;   
result = RFM2gOpen( parameter, &rH );

这样,你就避免了丑陋的演员。

< P>就像消息所说,已经从代码< > const char */> >转换为<代码> char */COD>(从C++语言继承的没有“<代码> const < />代码>的C++”)已经被删除。 为了避免这种情况,可以将参数存储在非常量字符串中,并将其传递给函数:

char parameter[] = "\\\\.\\rfm2g1";
RFM2G_STATUS   result;   
result = RFM2gOpen( parameter, &rH );

这样可以避免难看的强制转换。

请说明
RFM2gOpen()的签名是什么。
这是另一个文件STDRFM2GCALL RFM2gOpen(char*DevicePath,RFM2GHANDLE*rh)中此函数的定义;假设gcc没有理由使用“Qt”标记。请说明
RFM2gOpen()的签名是什么
is。这是另一个文件STDRFM2GCALL RFM2gOpen(char*DevicePath,RFM2GHANDLE*rh)中此函数的定义;假设gcc没有理由使用“Qt”标记。