web-dev-qa-db-fra.com

Avertissement C ++: conversion obsolète de la constante de chaîne en «char *» [-Wwrite-strings]

J'utilise gnuplot pour dessiner un graphique en C++. Le graphique est tracé comme prévu mais il y a un avertissement pendant la compilation. Que signifie l'avertissement?

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

C'est la fonction que j'utilise:

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

Les littéraux de chaîne sont un tableau de caractères const, nous pouvons le voir dans le projet de section standard C++ 2.14.5 Chaînes littérales qui dit ( c'est moi qui souligne):

Les littéraux de chaîne ordinaires et les littéraux de chaîne UTF-8 sont également appelés littéraux de chaîne étroite. Un littéral de chaîne étroite a le type "tableau de n const char" , où n est la taille de la chaîne telle que définie ci-dessous, et a une durée de stockage statique ( 3.7).

donc cette modification supprimera l'avertissement:

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

Remarque: autoriser un * caractère non const ** à pointer vers const données est une mauvaise idée car modifier un const ou un littéral de chaîne est comportement indéfini . Nous pouvons voir cela en allant à la section 7.1.6.1 Les cv-qualifiers qui dit:

Sauf que tout membre de classe déclaré mutable (7.1.1) peut être modifié, toute tentative de modification d'un objet const pendant sa durée de vie (3.8) entraîne un comportement indéfini.

et section 2.14.5 Chaînes littérales qui dit:

L'implémentation définit si tous les littéraux de chaîne sont distincts (c'est-à-dire s'ils sont stockés dans des objets non superposés). L'effet de la tentative de modification d'un littéral de chaîne n'est pas défini.

35
Shafik Yaghmour