从我在这里读到的内容来看,你不能这样做:
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
.
我怎样才能保留这个函数,并将数组传递给它而不出现警告/错误。
视情况而定。如果保证
setBuiltIns
不会修改字符串,您可以直接const_cast
将const
去掉。
否则,选择始终安全的路径并将文字复制到新的缓冲区中。
根据要求,第一个变体的示例:
void fun(char *builtins[]){}
int main () {
const char *delegates[] = {"IN",nullptr};
fun(const_cast<char **>(delegates));
}
您还可以在数组初始值设定项中将字符串文字转换为“char*”。
void fun(char *builtins[]){}
int main() {
char *delegates2[] = {(char*)"IN",nullptr};
fun(delegates2);
}
clang-cl -Wno-writable-strings first.cpp
这是我来这里时正在寻找的 cl-argument。
无论如何,我只是想补充一点,当您收到此警告时,代码不存在任何技术问题,并且我认为
const
无论如何在 C++ 中是一个毫无意义的构造,因为它:
const_cast
我知道这是主观的,但我只是想补充一点,因为C(++)是一种支持完全控制的语言,所以我认为你可以自己思考。不用说,我认为内部语义标准很好,所以我并不提倡你忽略所有标准。但我会鼓励人们进行娱乐性的实验或在原型设计时进行实验,然后从基本原理而不是惯例中进行推理。因为代码礼仪和架构建议中有很多教条和意识形态。