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]
带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复]
PyArg_ParseTupleAndKeywords 抛出警告:ISO C++ 禁止将字符串常量转换为‘char*’ [-Wwrite-strings]