C++ 警告:不推荐使用从字符串常量到“char*”的转换 [-Wwrite-strings]

Posted

技术标签:

【中文标题】C++ 警告:不推荐使用从字符串常量到“char*”的转换 [-Wwrite-strings]【英文标题】:C++ warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 【发布时间】:2014-02-03 13:53:15 【问题描述】:

我正在使用 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);

【问题讨论】:

这是 C,不是 C++ @Davidbrcz 首先,尽管它是 C 风格,但它仍然是有效的 C++ 代码。其次,将标签更改为 C 是不正确的,因为这不是 C 会发生的问题。在 C 中,字符串文字不是 const 类型。 @Davidbrcz 另请参阅Retagging C++ questions as C without consulting asker。 @余浩:在语法上是有效的。但是,编写该代码并声称它是用 C++ 编写的,在道德上是错误的。如果你在我的部门写了这个,你会立即被解雇。我的坏处是重新编排。但是我仍然认为让C++标签带有它是错误的。这维持了您可以像做 C 一样做 C++ 的错误想法。它们是 2 种独立的语言,不应同时标记任何问题,因为规范、习语和工具并不相同。要么是 C,要么是 C++,而不是两者。 两者都没有标记,它被标记为 C++。此外,C++ 支持许多不同的范例。 IMO 如果程序正确且整洁,则没有理由说代码错误,因为应该使用不同的范例。 OP的代码易读易懂。 【参考方案1】:

字符串字面量是 const char 的数组,我们可以从草案 C++ 标准部分2.14.5 字符串字面量 中看到这一点(emphasis mine):

普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。窄字符串文字具有“n const char 数组”类型,其中 n 是字符串的大小,定义如下,并且具有静态存储持续时间 (3.7)。

所以此更改将删除警告:

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

注意,允许 *non-const char** 指向 const 数据是一个坏主意,因为修改 const字符串文字 em> 是undefined behavior。我们可以通过 7.1.6.1 The cv-qualifiers 部分看到这一点:

除了可以修改任何声明为 mutable (7.1.1) 的类成员, 任何在 const 对象的生命周期 (3.8) 中修改其结果的尝试 在未定义的行为中。

和部分2.14.5 字符串文字说:

所有字符串文字是否不同(即存储在 不重叠的对象)是实现定义的。的效果 尝试修改字符串文字是未定义的。

【讨论】:

以上是关于C++ 警告:不推荐使用从字符串常量到“char*”的转换 [-Wwrite-strings]的主要内容,如果未能解决你的问题,请参考以下文章

C ++ - 从字符串常量到'char *'的不推荐转换[重复]

请帮助:[警告]不推荐将字符串常量转换为 'char*' [-Wwrite-strings]

C++ 不推荐将字符串常量转换为 'char*'

带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复]

PyArg_ParseTupleAndKeywords 抛出警告:ISO C++ 禁止将字符串常量转换为‘char*’ [-Wwrite-strings]

从字符串常量到 'char*' 的折旧转换