警告:字符串文字在初始化时转换为char *

时间:2015-03-12 16:55:57

标签: c++

如果我们需要解决警告,最佳解决方案是什么:

代码如下所示:

#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 *。 请让我知道如何摆脱警告信息。

2 个答案:

答案 0 :(得分:2)

将最后两个参数更改为const char *,或者更好的是std::string

您也可以将它们默认为NULL并对函数进行编码以处理该情况,就像传递空字符串一样。

答案 1 :(得分:2)

您正在使用字符串文字(即const)作为非const参数,可以在函数中进行修改。这很危险,因为这是(通常)只读存储器。编译器警告你这个事实。

如果需要修改字符串,可以删除默认参数,也可以使用std::string并按以下方式定义:

std::string = std::string()

虽然看起来你有很多或函数参数,但classstruct可能在这里有用。然后用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时要小心。