C ++警告:不推荐将字符串常量转换为'char *'[-Wwrite-strings]

时间:2014-02-03 13:53:16

标签: c++ string-literals

我正在使用gnuplot在C ++中绘制图形。该图正如预期的那样绘制,但在编译期间会出现警告。警告意味着什么?

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

这是我正在使用的功能:

void plotgraph(double xvals[],double yvals[], int NUM_POINTS)
{
    char * commandsForGnuplot[] = {"set title \"Probability Graph\"", 
        "plot     'data.temp' with lines"};
    FILE * temp = fopen("data.temp", "w");
    FILE * gnuplotPipe = popen ("gnuplot -persistent ", "w");
    int i;
    for (i=0; i < NUM_POINTS; i++)
    {
        fprintf(temp, "%lf %lf \n", xvals[i], yvals[i]); 
        //Write the data to a te  mporary file
    }
    for (i=0; i < NUM_COMMANDS; i++)
    {
        fprintf(gnuplotPipe, "%s \n", commandsForGnuplot[i]); 
        //Send commands to gn  uplot one by one.
    }
    fflush(gnuplotPipe);
}

1 个答案:

答案 0 :(得分:35)

字符串文字是一个的const char 数组,我们可以从草案C ++标准部分2.14.5 字符串文字中看到这一点(强调雷):

  

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字具有类型“n const char数组”,其中n是下面定义的字符串的大小,并且具有静态存储持续时间(3.7)。

所以此更改将删除警告:

const char * commandsForGnuplot[] = {"set title \"Probability Graph\"", "plot     'data.temp' with lines"};
^^^^^

注意,允许*非const char **指向 const 数据是一个坏主意,因为修改 const 字符串文字undefined behavior。我们可以通过转到7.1.6.1 cv-qualifiers 部分来看到这一点:

  

除了可以修改声明为mutable(7.1.1)的任何类成员,   任何在其生命周期(3.8)结果中修改const对象的尝试   在未定义的行为中。

和部分2.14.5 字符串文字,其中包含:

  

是否所有字符串文字都是不同的(即存储在   非重叠对象)是实现定义的。的效果   尝试修改字符串文字是未定义的。