禁用警告 "deprecated conversion from string constant to 'char*' [-Wwrite-strings]"
Disable warning "deprecated conversion from string constant to 'char*' [-Wwrite-strings]"
我的代码中有这两行:
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_STATUS
是在另一个文件中预定义的,之前不接受const。还有其他方法可以禁用此警告消息吗?
您似乎完全确定 RFM2gOpen
不会修改输入字符串,否则您的代码中会出现未定义的行为。
如果您确定输入数据不会被写入,您可以const_cast
安全地移除常量:
result = RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH );
同样,只有当例程不写入输入字符串时,这才是安全的,否则这是未定义的行为!
如果您不完全确定此方法永远不会写入字符数组,请将字符串复制到 std::vector<char>
并将 .data()
指针传递给函数(或使用简单的 char
数组为 ,很可能 efficient/appropriate 比 vector
).
一个可能的解决方法是:
RFM2gOpen(const_cast<char*>("\.\rfm2g1"), &rH);
如果 RFM2gOpen
尝试修改字符串,这可能会导致运行时错误。
以下不太可能导致内存错误,但它仍然是未定义的行为:
std::string s("\.\rfm2g1");
RFM2gOpen(const_cast<char*>(s.c_str()), &rH);
要完全符合要求,您需要将“\.\rfm2g1”复制到可变缓冲区。类似于:
char *s = alloca(strlen("\.\rfm2g1")+1);
strcpy(s, "\.\rfm2g1");
RFM2gOpen(s, &rH);
当然,真正的解决方法是将 RFM2gOpen
更新为 const char*
。
函数 RFM2gOpen()
似乎需要一个非常量 char*
作为第一个参数 (see here),因为遗留 API 有时会发生这种情况' s(或 API 由懒惰的编码人员编写),字符串文字的类型为 const char*
因此发生了不推荐使用的隐式转换(去掉了 const 限定符)。
如果您 *100% 确定函数不会修改指向的内存,那么 and only then 你能不能直接进行显式转换,例如const_cast<char*>("\\.\rfm2g1")
或(C 风格)(const char*)"\\.\rfm2g1"
正如消息所说,从 const char*
到 char*
的转换(C++ 继承自没有 const
的古老 C 语言)已被弃用。
为避免这种情况,您可以将参数存储在非常量字符串中,并将其传递给函数:
char parameter[] = "\\.\rfm2g1";
RFM2G_STATUS result;
result = RFM2gOpen( parameter, &rH );
这样你就可以避免丑陋的造型。
我的代码中有这两行:
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_STATUS
是在另一个文件中预定义的,之前不接受const。还有其他方法可以禁用此警告消息吗?
您似乎完全确定 RFM2gOpen
不会修改输入字符串,否则您的代码中会出现未定义的行为。
如果您确定输入数据不会被写入,您可以const_cast
安全地移除常量:
result = RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH );
同样,只有当例程不写入输入字符串时,这才是安全的,否则这是未定义的行为!
如果您不完全确定此方法永远不会写入字符数组,请将字符串复制到 std::vector<char>
并将 .data()
指针传递给函数(或使用简单的 char
数组为 vector
).
一个可能的解决方法是:
RFM2gOpen(const_cast<char*>("\.\rfm2g1"), &rH);
如果 RFM2gOpen
尝试修改字符串,这可能会导致运行时错误。
以下不太可能导致内存错误,但它仍然是未定义的行为:
std::string s("\.\rfm2g1");
RFM2gOpen(const_cast<char*>(s.c_str()), &rH);
要完全符合要求,您需要将“\.\rfm2g1”复制到可变缓冲区。类似于:
char *s = alloca(strlen("\.\rfm2g1")+1);
strcpy(s, "\.\rfm2g1");
RFM2gOpen(s, &rH);
当然,真正的解决方法是将 RFM2gOpen
更新为 const char*
。
函数 RFM2gOpen()
似乎需要一个非常量 char*
作为第一个参数 (see here),因为遗留 API 有时会发生这种情况' s(或 API 由懒惰的编码人员编写),字符串文字的类型为 const char*
因此发生了不推荐使用的隐式转换(去掉了 const 限定符)。
如果您 *100% 确定函数不会修改指向的内存,那么 and only then 你能不能直接进行显式转换,例如const_cast<char*>("\\.\rfm2g1")
或(C 风格)(const char*)"\\.\rfm2g1"
正如消息所说,从 const char*
到 char*
的转换(C++ 继承自没有 const
的古老 C 语言)已被弃用。
为避免这种情况,您可以将参数存储在非常量字符串中,并将其传递给函数:
char parameter[] = "\\.\rfm2g1";
RFM2G_STATUS result;
result = RFM2gOpen( parameter, &rH );
这样你就可以避免丑陋的造型。