C ++警告:从string常量到'char *'的弃用转换

我正在使用gnuplot在C ++中绘制graphics。 该图正在按预期进行绘图,但在编译期间出现警告。 警告是什么意思?

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

这是我正在使用的function:

 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); } 

string文字是一个常量字符数组 ,我们可以从C ++标准草案部分看到这一点2.14.5 string文字说( 强调我的 ):

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

所以这个改变会消除警告:

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

注意,允许一个非const char **指向const数据是一个坏主意,因为修改一个const或一个string文字是不确定的行为 。 我们可以通过参考7.1.6.1节中的cv-qualifiers来看到:

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

和部分2.14.5 string文字说:

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