Предупреждение C++: устаревшее преобразование из строковой константы в 'char*' [-Wwrite-strings]
Я использую 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 ответ
Строковые литералы - это массив константных символов, это видно из черновика стандартного раздела C++. 2.14.5
Строковые литералы, которые говорят (выделение мое):
Обычные строковые литералы и строковые литералы UTF-8 также упоминаются как узкие строковые литералы. Узкий строковый литерал имеет тип "массив из n const char", где n - размер строки, как определено ниже, и имеет статическую продолжительность хранения (3.7).
так что это изменение удалит предупреждение:
const char * commandsForGnuplot[] = {"set title \"Probability Graph\"", "plot 'data.temp' with lines"};
^^^^^
Обратите внимание, что разрешать * неконстантные символы ** указывать на константные данные - плохая идея, поскольку изменение константного или строкового литерала является неопределенным поведением. Мы можем увидеть это, перейдя в раздел 7.1.6.1
CV-квалификаторы, которые говорят:
За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить объект const в течение его времени жизни (3.8) приводит к неопределенному поведению.
и раздел 2.14.5
Строковые литералы, которые говорят:
Все ли строковые литералы различны (т.е. хранятся в неперекрывающихся объектах), определяется реализацией. Эффект попытки изменить строковый литерал не определен.