字符串文字的汇编

时间:2016-09-05 09:04:24

标签: c++ compilation string-concatenation string-literals

为什么可以在没有错误的情况下编译由空格,制表符或“\ n”分隔的两个字符串文字?

int main()
{
   char * a = "aaaa"  "bbbb";
} 

“aaaa”是一个字母* “bbbb”是一个char *

没有特定的连接规则来处理两个字符串文字。显然,以下代码在编译期间出错:

#include <iostream>
int main()
{
   char * a = "aaaa";
   char * b = "bbbb";
   std::cout << a b;
}

这种连接是否适用于所有编译器? “aaaa”的空终止在哪里? “aaaabbbb”是一个连续的RAM块吗?

5 个答案:

答案 0 :(得分:9)

如果您看到例如它在第6阶段this translation phase reference

  

连接相邻的字符串文字。

这就是这里发生的事情。您有两个相邻的字符串文字,它们连接成一个字符串文字。

这是标准行为。

它只适用于字符串文字,而不是你注意到的两个指针变量。

答案 1 :(得分:5)

在本声明中

-1

编译器在编译的某个步骤之前,在语法分析中将相邻的字符串文字视为一个文字。

因此对于编译器,上述语句等同于

char * a = "aaaa"  "bbbb";

即编译器只存储一个字符串文字char * a = "aaaabbbb";

答案 2 :(得分:4)

根据C(和C ++)标准的规则连接相邻的字符串文字。但是相邻标识符(即变量"aaaabbbb"a)不存在这样的规则。

引用,C ++ 14(N3797草案),§2.14.5:

  

在翻译阶段6(2.2)中,相邻的字符串文字是   级联。如果两个字符串文字都具有相同的encoding-prefix,   生成的连接字符串文字具有该encoding-prefix。如果   一个字符串文字没有编码前缀,它被视为一个字符串   与另一个操作数相同的编码前缀的文字。如果是UTF-8   字符串文字标记与宽字符串文字标记相邻   程序是不正确的。任何其他连接都是   有条件地支持实现定义的行为。

答案 3 :(得分:3)

在C和C ++中,将相邻的字符串文字编译为单个字符串文字。例如:

"Some text..." "and more text"

相当于:

"Some text...and more text"

由于历史原因:

  

最初的C语言是在1969 - 1972年设计的,当时计算仍由80列打孔卡主导。其设计人员使用了80个列设备,如ASR-33 Teletype。这些设备没有自动换行文本,因此真正有动力将源代码保存在80列之内。在他们最终转向自由格式之前,Fortran和Cobol有明确的延续机制。

     

Dennis Ritchie(我假设)意识到语法中没有歧义,并且通过使编译器连接到相邻的简单方便,可以使长ASCII字符串适合80列,这是一种辉煌的表现。文字字符串。无数C程序员对这个小功能表示感谢。

     

一旦该功能进入,为什么它会被移除?它不会导致悲伤,而且经常使用。我希望有更多的语言能够拥有它。现代趋势是使用三引号或其他符号扩展字符串,但C中此功能的简单性从未超出过。

Similar question here

答案 4 :(得分:2)

  

并排放置的字符串文字在转换阶段6(在预处理器之后)连接在一起。也就是说,"Hello," " world!"产生(单个)字符串"Hello, world!"。如果两个字符串具有相同的编码前缀(或者两者都没有),则生成的字符串将具有相同的编码前缀(或没有前缀)。

source