过去我一直在使用Visual Studio 2010/2013/2015,这种语法是可能的:
gulp test
我决定继续改变我对Linux的编码生活方式,因为我安装了g ++并将SlickEdit作为我的IDE。
似乎这句话不再适用了。 任何人都可以说明原因吗?
但这有效:
char* szString = "This works!";
错误与c ++ 11有关。
有谁知道为什么会这样?不是如何修复它,导致在我的工作区中没有任何方法来安装c ++ 11编译器,我只是好奇它是否与后台有关编译器工作方式的内容有关。 我对第一行代码的了解是,它在堆栈上创建一个常量变量,并创建一个新的指针设置自己朝着ESP的值,但在第二行,它计算常量变量上的字母数量,然后最后设置一个null终止符。
哦还有一件事 - >在GCC / GPP中设置第一个的方式似乎也有所不同,因为第一个类型是{char *&},第二个类型是{char(*)[12]},对此有任何解释太?谢谢!
答案 0 :(得分:6)
当您编写文字"text"
时,该文本将包含在已编译的程序图像的某处。出于安全原因,程序映像通常放在现代操作系统的写保护内存中。
char* someString = "text";
声明指向可能写保护的程序映像中的字符串的指针。将此指针声明为非const的能力是包含在C ++ 11中以保持与C的源兼容性的功能。请注意,即使someString
不是指向const的指针,也不会尝试修改该值它指向的仍然会导致未定义的行为。在C ++ 11中删除了此向后兼容性功能。现在必须将someString
声明为指向const的指针:const char* someString = "text";
。你可以抛弃const
,但是试图写入指向的值仍然会导致未定义的行为与你转换为非const的任何const
值相同。
char someString[] = "text";
的工作方式不同。这会将程序代码存储器中的字符串"text"
复制到位于数据存储器中的数组中。它类似于
char someString[5];
strcpy(someString, "text");
由于someString
是程序数据存储器中的一个数组,所以可以写入它,并且它不需要是const限定的。
答案 1 :(得分:2)
根据标准:附件C(Compatability)
C1.1子条款2.14.5:
更改:字符串文字使const
字符串文字的类型从“char of char”更改为“const char数组。”char16_t字符串文字的类型从“some-integer-type”数组更改为“const char16_t数组” “char32_t字符串文字的类型从”some-integer-type数组“更改为”const char32_t数组。“
宽字符串文字的类型从“wchar_t数组”更改为“const wchar_t数组”。
基本原理:这可以避免调用不适当的重载函数,该函数可能希望能够修改其参数。
事实上,C ++标准2.14.5.8说:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间
这也允许这样的字符串得到各种特殊处理:编译器/链接器可以选择消除跨编译单元的字符串重复,(以msvc术语表示字符串池),它可以将它们存储在数据部分和只读存储器中
2.14.5.12
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。尝试修改字符串文字的效果未定义。
char* x = "hello world";
是对C ++从早期C继承的回归.Visual Studio支持它,因为他们自己的库中存在沉重的包袱。