方法的定义是:
void setArgument(char *);
然后我用以下代码调用该方法:
setArgument("argument");
但是我的VisualStudio编译器给我下一个错误:
无法将参数1从'const char [10]'转换为'char *'
是否可以发送这样的参数,或者我必须在方法中更改参数类型? 另外,VS在输出中向我显示下一条注释:注意:从字符串文字转换会丢失const限定符(请参见/ Zc:strictStrings)
答案 0 :(得分:3)
问题在于字符串文字是由 恒定 个字符组成的数组。
虽然数组很容易衰减到指向其第一个元素的指针,但是该指针的类型为const char *
。哪个应该是您函数的参数类型。
如果需要修改传递的字符串,则应创建自己的非常数数组:
char argument[] = "argument";
setArgument(argument);
当然,由于您使用C ++进行编程,因此应停止使用char
指针和数组,而应使用std::string
。
答案 1 :(得分:1)
可能的是,即使您真的需要参数是可变的(char*
而不是char const*
),也需要在可变存储器中分配新的存储并克隆常量存储器的内容到那里,如果这符合您对“转换”的定义。
auto const len = strlen(input);
auto const buf = std::unique_ptr<char[]>(new char[len + 1]);
memcpy(buf, input, len + 1);
如果您实际上需要char const*
,并且如果您是C++17
或更高版本,则可以将签名更改为setArgument(std::string_view arg)
,以防误用。