2

假设我有这个C代码

f((char []){ "hello" });
f((const char []){ "hello" });
f("hello");

在所有三种情况下,hello都被复制到函数中。指向 char 数组第一个字符的指针被初始化为函数参数。

我知道在 C 中,字符串文字对应于,char []而在 C++ 中,字符串文字对应于const char [],但它会创建与 with 相同的代码吗char []const char []

在 C 程序中,你能交换所有出现的"string"with(char []){ "string" }并在汇编级别得到相同的结果吗?

4

1 回答 1

4

我不能说会根据 C 标准(6.5.2.5 复合文字)生成什么代码

7 字符串文字和具有 const 限定类型的复合文字不需要指定不同的对象。

还有一个例子

13 示例 6 与字符串文字一样,const 限定的复合文字可以放入只读内存中,甚至可以共享。例如,

(const char []){"abc"} == "abc"

如果文字的存储是共享的,可能会产生 1。

正如您正确提到的 C 中的字符串文字具有非常量字符数组的类型。但是,它们可能不会被修改。另一方面,可以修改没有限定符 const 的复合文字。这会影响生成的汇编代码。或者,如果将限定符 const 与复合文字一起使用,则结果类型与相应字符串文字的类型不同。所以这又会影响生成的汇编代码。

另一个区别是字符串文字在任何情况下都具有静态存储持续时间,但复合文字可以具有自动存储持续时间。这也会影响生成的汇编代码。

于 2016-02-21T19:18:38.367 回答