加载图形文件

Loading graphic files

#include <graphics.h> //importing graphics
#include <conio.h>

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

我在 Code::Blocks 中输入了上面的代码,但它没有执行,而是显示

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

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

前言:这个答案我删了又恢复了好几次。还有其他问题涉及这个主题,但其中大多数似乎都集中在 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 .