web-dev-qa-db-ja.com

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

文字列リテラルは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またはstringリテラルの変更は ndefinedなので、* non-const char **がconstデータを指すようにすることは悪い考えです。動作 。これはセクション7.1.6.1cv-qualifiers

Mutable(7.1.1)として宣言されたクラスメンバを変更できる場合を除き、存続期間(3.8)の間にconstオブジェクトを変更しようとすると、未定義の動作が発生します。

セクション2.14.5文字列リテラルは次のとおりです。

すべての文字列リテラルが異なる(つまり、重複しないオブジェクトに格納される)かどうかは、実装によって定義されます。文字列リテラルを変更しようとする効果は未定義です。

35
Shafik Yaghmour