我有一个接收 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"; 时(您正在创建一个指向 4 字节字符串的非 const 指针)您不得修改)。

在我看来,您永远不应该将字符串文字直接转换为 char* ,而是将其放入 const char* 然后(如果您正在与遗留 API 进行通信)明确地 const_cast<char*> const ness away,并有一条评论说您正在与遗留系统交谈保证不更改 char 的 API。这样做的好处是您可以在 API 升级时搜索程序中的那些 const_cast ,或者您想找到涉及写入 char* 的段错误来自哪里。

甚至可以用 const char* 版本包装遗留 API,在其中执行 const_cast

最糟糕的情况是有一堆 char* 闲置,其中一些是可写的,另一些来自字符串文字。

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

10-11 22:07
查看更多