为了账号安全,请及时绑定邮箱和手机立即绑定

C ++警告:不建议将字符串常量转换为'char *'[-Wwrite-strings]

/ 猿问

C ++警告:不建议将字符串常量转换为'char *'[-Wwrite-strings]

C++
慕姐829404 2019-11-19 14:34:51

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

}


查看完整描述

2 回答

?
慕妹3242003

字符串文字是const char的数组,我们可以从C ++标准草案的2.14.5 字符串文字中看到这一点,文字(强调我的):


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


因此此更改将删除警告:


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

^^^^^

注意,允许* non-const char **指向const数据是一个坏主意,因为修改const或字符串文字是未定义的行为。我们可以通过转到7.1.6.1 cv-qualifiers部分看到这一点:


除了可以声明任何声明为可变的类成员(7.1.1)之外,任何在其生存期(3.8)内修改const对象的尝试都会导致未定义的行为。


和2.14.5 字符串文字部分,内容为:


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


查看完整回答
反对 回复 2019-11-19
?
白衣染霜花

从语法上讲是有效的。但是,编写该代码并声称它是用C ++编写在道德上是错误的。如果您在我的部门写过这封信,您将立即被解雇。我不好重读。但是我仍然认为让C ++标记与它在一起是错误的。这保持了您可以像执行C一样执行C ++的错误想法。它们是2种独立的语言,并且由于规范,习语和工具不同,因此不应该同时标记任何问题。无论是C ++,还是C ++都不是C。

查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信