gpt4 book ai didi

c++ - 适合在函数参数中将字符串文字转换为 char * 吗?

转载 作者:太空狗 更新时间:2023-10-29 19:53:32 24 4
gpt4 key购买 nike

我有一个接收 char * 参数的函数:

Foo::Foo (char * arg0) {
....
}

在原始示例中,char[] 用于传递此值...

char bar[] = "Bar";
Instance.foo (bar);

...效果很好。

但是,我发现我可以传递一个字符串文字,转换为 char *,编译器不会发出任何警告。

Instance.Foo ((char *) "Bar");

但是,根据我的阅读,似乎应该避免这种情况 - 指向的内存的值可能会改变。

上述说法是否正确(“应该避免这种情况”)或者在这种情况下是否合适?


编辑 - 出现了进一步的研究 this article这很好地解决了我的问题......

最佳答案

是的,避免这种情况。现在,如果你的函数使用了 const char *用字符串文字调用它没有错。

C++ 编译器支持字符串文字到 char *仅出于向后兼容性原因,写入字符串文字会导致未定义的行为。

当你做 char bar[] = "Bar";你正在做一些根本不同的事情(即用你可以自由修改的值 {'B', 'a', 'r', '\0'} 初始化一个由 4 个字符组成的数组)与你做 char bar* = "Bar"; 时相比。 (您正在创建一个非 const 指针,指向您不能修改的 4 字节字符串)。

在我看来,你永远不应该将字符串文字直接转换为 char* , 而不是将其放入 const char*然后(如果您正在与遗留 API 通信)显式 const_cast<char*> const ness 走了,评论说你正在与一个遗留的 API 交谈,它保证不会改变 char秒。这样做的好处是您可以在程序中搜索那些 const_cast当 API 升级时,或者您想查找涉及写入 char* 的段错误的位置来自。

甚至可以用 const char* 包装遗留 API执行 const_cast 的版本在他们之中。

绝对最糟糕的情况是有一堆 char*它四处闲逛,其中一些是可写的,另一些来自字符串文字。

关于c++ - 适合在函数参数中将字符串文字转换为 char * 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13149843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com