rul*_*lof 137 c c++ string char c++11
C++ 11标准(ISO/IEC 14882:2011)在§ C.1.1
:
char* p = "abc"; // valid in C, invalid in C++
Run Code Online (Sandbox Code Playgroud)
对于C++来说,没关系,因为指向String Literal的指针是有害的,因为任何修改它的尝试都会导致崩溃.但为什么它在C中有效?
C++ 11还说:
char* p = (char*)"abc"; // OK: cast added
Run Code Online (Sandbox Code Playgroud)
这意味着如果将强制转换添加到第一个语句,它将变为有效.
为什么转换使第二个语句在C++中有效?它与第一个语句有什么不同?它不是仍然有害吗?如果是这样的话,为什么标准说它没关系?
Jer*_*fin 165
通过C++ 03,您的第一个示例是有效的,但使用了不推荐的隐式转换 - 字符串文字应该被视为类型char const *
,因为您无法修改其内容(不会导致未定义的行为).
从C++ 11开始,已经弃用的隐式转换被正式删除,因此依赖它的代码(就像你的第一个例子)应该不再编译.
您已经注意到允许代码编译的一种方法:虽然隐式转换已被删除,但显式转换仍然有效,因此您可以添加强制转换.但是,我不认为这会"修复"代码.
真正修复代码需要将指针类型更改为正确的类型:
char const *p = "abc"; // valid and safe in either C or C++.
Run Code Online (Sandbox Code Playgroud)
至于为什么它在C++中被允许(并且仍然在C中):仅仅因为有很多现有代码依赖于隐式转换,并且打破代码(至少没有一些官方警告)显然似乎是标准委员会之类的一个坏主意.
baz*_*baz 14
您还可以使用strdup:
char* p = strdup("abc");
Run Code Online (Sandbox Code Playgroud)
或者
char p[] = "abc";
Run Code Online (Sandbox Code Playgroud)
正如这里所指出的
Bar*_*mar 11
由于历史原因,它在C中有效.C传统上指定字符串文字的类型char *
而不是const char *
,虽然它通过说你实际上不允许修改它来限定它.
当你使用强制转换时,你实际上告诉编译器你比默认的类型匹配规则更清楚,并且它使得赋值正常.
您可以声明以下选项之一:
char data[] = "Testing String";
Run Code Online (Sandbox Code Playgroud)
或者
const char* data = "Testing String";
Run Code Online (Sandbox Code Playgroud)
或者
char* data = (char*) "Testing String";
Run Code Online (Sandbox Code Playgroud)