如果我们需要解决警告,最佳解决方案是什么:
代码如下所示:
#include<iostream>
using namespace std;
int main()
{
// There is a call to the function myfunc
myfunc(char*, char*, char*, int, char*, char*, char*, char*, char*,
char*, char*, char*, char*, char*, char*,
char*, char*, int, int, int, int, int,
int, int, int, int, int, int, int,
int, int,int,int=9999,int=11,int=8888,char* ="",char* ="");
return 0;
}
Warning: String literal converted to char* in initialization.
这里我遇到的问题是 - 我想最后两个char * =&#34;&#34;。此外,由于某些默认参数是在两者之间指定的,因此必须使用双引号指定最后两个char *。 请让我知道如何摆脱警告信息。
答案 0 :(得分:2)
将最后两个参数更改为const char *
,或者更好的是std::string
。
您也可以将它们默认为NULL
并对函数进行编码以处理该情况,就像传递空字符串一样。
答案 1 :(得分:2)
您正在使用字符串文字(即const)作为非const参数,可以在函数中进行修改。这很危险,因为这是(通常)只读存储器。编译器警告你这个事实。
如果需要修改字符串,可以删除默认参数,也可以使用std::string
并按以下方式定义:
std::string = std::string()
虽然看起来你有很多或函数参数,但class
或struct
可能在这里有用。然后用std :: string实现最后2个参数几乎是微不足道的,因为你需要重构所有调用函数的代码。
修改强>
让我们说myfunc
的定义是这样的(我删除了一些参数;))并使用一些内部函数只读取然后可能修改最后一个参数。
void myfunc(char* first, std::string second = std::string())
{
// read_only_function takes a const char*
read_only_function(second.c_str());
// modify_function takes a char*, it should probably take a length too
// or have some kind of documented agreement on length.
char temp[choose_your_size];
modify_function(temp, ... and possibly buffer size);
second.assign(temp, ...); // Pick the according overloads
}
当然,只有当您无法控制这些内部功能时才会这样做。如果你有,我也会重构它们以在参数中使用std :: string进行修改。
最后,请记住std::string
不一定包含空终止字符串,因此在使用c_str
时要小心。