假设我有C
代码
f((char []){ "hello" });
f((const char []){ "hello" });
f("hello");
在所有三种情况下, 一个指向char数组第一个字符的指针被初始化为函数参数。hello
被复制到函数中。
我知道在C中,字符串文字对应char []
,而在C ++中,字符串文字对应const char []
,但它会创建与char []
或{{相同的代码1}}?
在C程序中,你能用const char []
交换"string"
的所有出现并在汇编级别获得相同的结果吗?
答案 0 :(得分:3)
我不能说将生成什么代码但是根据C标准(6.5.2.5复合文字)
7字符串文字和具有const限定类型的复合文字, 不需要指定不同的对象。
还有一个例子
13示例6与字符串文字类似,const限定的复合文字 可以放入只读内存,甚至可以共享。对于 例如,
(const char []){"abc"} == "abc"
如果文字的存储是共享的,可能会产生1。
正如您正确提到的,C中的字符串文字具有非常量字符数组的类型。但是它们可能不会被修改。另一方面,可以修改没有限定符const的复合文字。这可能会影响生成的汇编代码。或者,如果要使用带有复合文字的限定符const,则结果类型与对应的字符串文字的类型不同。因此,这可能会影响生成的汇编代码。
另一个区别是字符串文字在任何情况下都具有静态存储持续时间,但复合文字可以具有自动存储持续时间。这也会影响生成的汇编代码。