禁用警告 "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 );

这样你就可以避免丑陋的造型。