禁用警告“已弃用从字符串常量转换为'char *'[-Wwrite-strings]”

时间:2015-09-03 13:20:45

标签: c++ gcc mingw32 string-literals

我的代码中有这两行:

@f = ActionView::Helpers::FormBuilder.new(:object, @customer, view_context, {})

我收到错误消息:

$("some-div").html("<%= j render('some_partial', f: @f) %>");

实际上我无法将其修改为

RFM2G_STATUS   result;   
result = RFM2gOpen( "\\\\.\\rfm2g1", &rH );

因为"warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] result = RFM2gOpen( "\\\\.\\rfm2g1", &rH );" 是在另一个文件中预先定义的,并且之前不接受const。还有其他方法可以禁用此警告消息吗?

4 个答案:

答案 0 :(得分:2)

正如消息所述,已弃用从const char*char*的转换(C ++继承自古代C语言,但没有const)。

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

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

这样你可以避免丑陋的演员。

答案 1 :(得分:1)

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

如果你确定不会写入输入数据,你可以安全地const_cast常量:

result = RFM2gOpen(const_cast<char*>("\\\\.\\rfm2g1"), &rH );

同样,只有当例程写入输入字符串时,这才是安全的,否则这是未定义的行为!

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

答案 2 :(得分:1)

一种可能的解决方法是:

RFM2gOpen(const_cast<char*>("\\.\rfm2g1"), &rH);

如果RFM2gOpen尝试修改字符串,这可能会导致运行时错误。

以下内容不太可能导致内存故障,但仍然存在未定义的行为:

std::string s("\\.\rfm2g1");
RFM2gOpen(const_cast<char*>(s.c_str()), &rH);

要完全符合要求,您需要复制&#34; \。\ rfm2g1&#34;到一个可变的缓冲区。类似的东西:

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

真正的解决方法当然是RFM2gOpen更新为const char*

答案 3 :(得分:0)

似乎函数RFM2gOpen()期望非const char*作为第一个参数(see here),因为它有时可能发生在遗留API(或由懒惰编码器编写的API)上),字符串litterals属于const char*类型  所以发生了一个弃用的隐式转换(摆脱了const限定符)。

如果你'100%确定该功能不会修改指向内存,那么 然后可以你只需要进行明确的转换,例如const_cast<char*>("\\\\.\\rfm2g1")或(C风格)(const char*)"\\\\.\\rfm2g1"