我正在使用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);
}
答案 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
字符串文字,其中包含:
是否所有字符串文字都是不同的(即存储在 非重叠对象)是实现定义的。的效果 尝试修改字符串文字是未定义的。