Подтвердить что ты не робот

Предупреждение С++: устаревшее преобразование из строковой константы в 'char * [-Wwrite-strings]

Я использую gnuplot для рисования графика на С++. График является сюжетом, как ожидалось, но во время компиляции есть предупреждение. Что означает предупреждение?

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

Ответ 1

Строковые литералы представляют собой массив const char, мы можем видеть это из черновика стандартного раздела С++ 2.14.5 Строковые литералы, в котором говорится (подчеркивание мое):

Обычные строковые литералы и строковые литералы UTF-8 также называются узкими строковыми литералами. Узкий строковый литерал имеет тип "массив из n const char" , где n - размер строки, как определено ниже, и имеет статическую продолжительность хранения (3.7).

чтобы это изменение удалило предупреждение:

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

Замечание, позволяющее * not-const char ** указывать на const-данные, является плохой идеей, так как изменение константы или строкового литерала undefined. Мы можем видеть это, перейдя в раздел 7.1.6.1. Cv-квалификаторы, которые говорят:

За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить объект const в течение его жизненного цикла (3.8) в режиме undefined.

и раздел 2.14.5 Строковые литералы, в которых говорится:

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