Предупреждение 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 Строковые литералы, которые говорят:

Все ли строковые литералы различны (т.е. хранятся в неперекрывающихся объектах), определяется реализацией. Эффект попытки изменить строковый литерал не определен.

Другие вопросы по тегам