我的代码中有这两行:
@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。还有其他方法可以禁用此警告消息吗?
答案 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"