我有一个接收 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/