【问题标题】:ERROR : ISO C++ forbids conversion from string constant to char* [duplicate]错误:ISO C++ 禁止从字符串常量转换为 char* [重复]
【发布时间】:2019-04-08 18:29:56
【问题描述】:

所以,我有一个使用图形模式 [graphics.h] 库的程序... 我想初始化图表,所以我会很自然地这样做:

initgraph(graphics_driver,graphics_mode,"") ;

当我编译上面的时候,它给出了错误“ISO C++ 禁止将字符串常量转换为 char*”

我知道一种解决方法:

char c_array[] = "" ; 
initgraph(graphics_driver,graphics_mode,c_array) ;

上面的编译就好了... 像initgraph().. 这样的函数没问题,因为我只会调用它一次。但是,我想像这样使用outtextxy() 函数(因为我在我的程序中多次调用它):

outtextxy(0,0,"Test") ;

因为为所有不同的outtextxy() 函数声明一个数组只会浪费空间。

那么,有没有办法在没有数组或任何额外变量的情况下使用上述内容?

P.S:在安装 graphics.h 库并配置所有链接器选项后,我正在使用代码块。等等……

谢谢,再见, 塞缪尔

【问题讨论】:

  • 可能initgraph 想要一个可写的第三个参数。字符串文字是 const。
  • @rustyx 有趣的是它没有

标签: c++ codeblocks


【解决方案1】:

如果您绝对确定 outtextxy() 不会修改传递给它的字符串,您可以编写自己的包装函数,例如:

void my_outtextxy(int x, int y, const char* text) {
  outtextxy(x, y, const_cast<char*>(text));
}

【讨论】:

  • @LightnessRacesinOrbit 我也更喜欢现代 api。但有时由于某种原因这是不可能的,所以我想我添加这个解决方案以防万一。
  • 值得一提const_cast&lt;char*&gt;(text)... 如果原始对象 非const,你只能抛弃const。如果你在一个 const 对象上抛弃 const ,那么未定义的行为。该规则保护诸如 ROM 中的字符串之类的东西,您确实无法写入内存。另见How do you cast away const'ness when the function takes a reference to the object
  • @jww:那不是真的。你可以const_cast尽情享受;但是,如果您随后对表达式执行变异操作,并且它引用了不可变的内容,则 that 具有未定义的行为。出于这个原因,const_cast 通常是一种糟糕且危险的做法(因为您从类型系统中剥夺了实际告诉您何时要执行该 UB 事情的能力);但是,在这种情况下,这是合理且安全的。您链接到的页面确实说明了这一点。
【解决方案2】:

你引用的文件graphics.hpositively ancient

它太老了,早于const

二十年来,字符串文字一直是const char[N]。从那时起,它就被弃用了,而是假装他们是char[N]。从 C++11 开始,它完全是非法的。从const 之前的旧时代迁移代码用了 13 年,此后又过了 7 年。

您必须像现在一样解决这个问题(将字符串文字复制到一个可能的可变缓冲区,即使它不会被变异!),用 const_cast 解决它(是 非常确信这个论点不会被改变!),或者使用这个千年的库。

【讨论】:

    猜你喜欢
    • 2019-10-24
    • 2022-01-01
    • 2019-06-12
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多