ISO C++11 不允许从字符串转换为字符

问题描述 投票:0回答:3

从我在这里读到的内容来看,你不能这样做:

char *delegates[]={"IN",NULL};

必须是这样,这样你就不会收到警告:

const char *delegates[]={"IN",NULL};

但是我有一些功能我无法更改,看起来像:

void Interpreter::setBuiltIns(char *builtins[],int num  )

此函数不会以任何方式更改数组。

如果我尝试将字符串数组传递给它:

myclass.setBuiltIns(delegates, 1);

我收到错误,但如果我从 const

remove
delegate
就没有错误,但我得到
ISO warning
.

我怎样才能保留这个函数,并将数组传递给它而不出现警告/错误。

c++
3个回答
9
投票

视情况而定。如果保证

setBuiltIns
不会修改字符串,您可以直接
const_cast
const
去掉。

否则,选择始终安全的路径并将文字复制到新的缓冲区中。


根据要求,第一个变体的示例:

void fun(char *builtins[]){}

int main () {
    const char *delegates[] = {"IN",nullptr};
    fun(const_cast<char **>(delegates));
}

2
投票

您还可以在数组初始值设定项中将字符串文字转换为“char*”。

void fun(char *builtins[]){}

int main() {
    char *delegates2[] = {(char*)"IN",nullptr};
    fun(delegates2);
}

0
投票
clang-cl -Wno-writable-strings first.cpp

这是我来这里时正在寻找的 cl-argument。

无论如何,我只是想补充一点,当您收到此警告时,代码不存在任何技术问题,并且我认为

const
无论如何在 C++ 中是一个毫无意义的构造,因为它:

  1. 可以用
    const_cast
  2. 删除
  3. 不会改变生成的代码根据我的经验
  4. 我们的项目中从未发现过任何错误
  5. 使得以后更改代码变得更加困难

我知道这是主观的,但我只是想补充一点,因为C(++)是一种支持完全控制的语言,所以我认为你可以自己思考。不用说,我认为内部语义标准很好,所以我并不提倡你忽略所有标准。但我会鼓励人们进行娱乐性的实验或在原型设计时进行实验,然后从基本原理而不是惯例中进行推理。因为代码礼仪和架构建议中有很多教条和意识形态。

© www.soinside.com 2019 - 2024. All rights reserved.