2017-04-11 73 views
-1
#include <graphics.h> //importing graphics 
#include <conio.h> 

int main() 
{ 
    int gd=0,gm; 
    initgraph(&gd,&gm," "); 
    circle(100,80,20); 
    getch(); 
    closegraph(); 
} 

我输入了代码::块上面的代码,但它不执行,并而是说加载图形文件

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

我一直在尝试了三天。有人请帮助我。 我已经安装了winbgim.h和其他必要的图形文件,但没有帮助。我已经找遍了所有可能的网站...

The red color is indicating the error line

+1

[C++不推荐将字符串常量转换为'char \ *'](http://stackoverflow.com/questions/1524356/c-deprecated-conversion-from-string-constant-to-char) –

+1

请确定您正在使用哪种语言。 C不是C++ – Gerhardh

+0

OP显然选择了C,建议的伪指针似乎不适用。 –

回答

0

序言:我删除,然后取消删除这个答案好几次。还有其他一些问题可以解决这个问题,但其中大多数似乎都集中在C++上,C++在这方面与C有一些不同,或者被视为关于这个问题的一个隐瞒。有些人有我不关心的或者不完整的答案。因此,在一个傲慢自大的行为中,我提供了这个答案,并且我选择在这里提供它。


因为我不断在代码中看到的唯一字符串是" "参数initgraph(),警告必须从那里产生。在这种情况下,该函数的第三个参数必须声明为char *

在这种情况下,您提供的代码并没有固有的错误。根据标准,字符串常量对应于char的数组,并且在评估它的大多数上下文中(包括它作为函数参数出现的时间),这样的数组会自动转换为指向其第一个元素的指针。这完全符合该功能。

问题是标准还说如果程序试图修改字符串文字的内容,那么它会产生未定义的行为。实际上这是程序崩溃的情况并不罕见。因此,尽管技术上合法,但当您将字符串常量转换为char *时,您会承担很大的风险,因为处理指针的人可能不知道尝试使用它来修改指向的内容是不安全的。如果您转换为const char *,则不会出现此问题。

GCC希望帮助您检测这些问题。因此,它的-Wwrite-strings]选项启用后,会将字符串常量视为const char的数组而不是数组char,因此会触发警告,例如遇到的警告。

你至少有三种选择:

  1. 您可以禁用-Wwrite-strings编译选项。这可能是具有良好测试行为的遗留代码的最佳方法,但我不建议使用其他方法。

  2. 只要实际上函数不尝试修改阵列,其参数指向,直接或间接地,可以改变函数参数输入const char *。这可能需要进行一系列其他类似的更改以避免附加的相关警告。

  3. 避免将字符串文字传递给该函数。相反,请创建并传递一个可变数组char。例如:

int gd = 0, gm; 
char s[] = " "; 

initgraph(&gd, &gm, s); 
// ... 

请特别注意,在那里,虽然有一个字符串文字,它仅用于初始化的不同,非const阵列s

+0

非常感谢@JohnBollinger与上面那个.....我做了同样的事情(我保存文件为.cpp然后它工作)....程序编译,但是当我运行代码时,它停止工作。 ...在构建消息中,它表示**构建文件:“no project”中的“no target”(编译器:未知)** ....为什么会发生这种情况? –

+0

@RabinBK,你的新问题听起来像是你的项目配置问题。更改源文件后缀可能会产生这样的问题(我注意到,这并不是我的建议之一,也不一定安全)。我无法对此多说。 –