C允许我们通过MACRO连接文字列表。
#define H "HELLO"
#define W "WORLD"
#define HW H " " W
这会导致HELLO WORLD
的扩展。
同样可以通过初始化列表实现。
char A[] = "Hello" " " "World";
这也会导致HELLO WORLD
的扩展。
同样适用于printf("%s\n", "HELLO" " " "WOLRD");
。
即使在这里,也会导致扩展到HELLO WORLD
。
在上述所有情况中,我们可以看到,字符串文字被连接起来:)
char B[] = "HELLO";
char C[] = " ";
char D[] = "WORLD";
char E[] = B C D;
但同样不会反映变量。 为什么会这样?
答案 0 :(得分:1)
宏和初始化列表都不对您观察的内容负责。
当C在源代码中找到彼此相邻的两个文字时,它会将它们连接起来。因此,"hello" "world"
与键入"helloworld"
相同。
答案 1 :(得分:1)
但同样没有反映变量。为什么会这样?
有几个原因:
"
分隔符,这使得它们在此级别易于识别); < / LI>
char E[] = B C D;
; B
,C
和D
将转换为指针表达式,不会被视为char
的数组; < / LI>
醇>
此外,并非所有char
数组都保证存储字符串。而且你必须为连接的字符串留出存储空间。
标准对此有何评价?
C程序分为8个不同的阶段(详见C 2011 Standard的第5.1.1.2节)。
阶段1到6描述了预处理器的动作;物理源文件字符映射到源字符集,三字符转换为单字符等价物,带有尾随\
字符的物理行拼接成单个逻辑源行,注释替换为单个空白字符,扩展宏,执行预处理指令,并且,作为预处理器的最后一步,串联字符串文字。
第7阶段是编译器实际解析按摩源文本的位置。
第8阶段基本上是链接器步骤。
<强> TL / DR 强>
字符串文字是特殊的,并由预处理器专门处理。