C 允许我们通过宏连接文字列表。
#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;
但同样不反射(reflect)变量。 为什么会这样?
最佳答案
but same doesn't reflects with variables. why is it so?
几个原因:
- 字符串连接是由预处理器在解析源文本之前完成的(这是可能的,因为字符串文字具有
"
分隔符,使它们在此级别易于识别); - 有一个定义良好的初始化语法,它根本不允许像
char E[] = B C D;
; 这样的初始化。 - 同样,表达式
B
、C
和D
会转换为指针表达式,并且不会被视为char
数组;
此外,并非所有 char
数组都保证存储字符串。而且您必须为连接的字符串留出存储空间。
What does the standard say about it?
C 程序分为 8 个不同的阶段进行翻译(有关详细信息,请参阅 C 2011 Standard 的第 5.1.1.2 节)。
第 1 阶段到第 6 阶段描述了预处理器的操作;物理源文件字符映射到源字符集,三字母转换为单字符等效项,带有尾随\
字符的物理行拼接成单个逻辑源行,注释被替换为单个空白字符,扩展宏,执行预处理指令,并且作为预处理器的最后一步,连接字符串文字。
第 7 阶段是编译器实际解析经过处理的源文本的阶段。
第 8 阶段基本上是链接器步骤。
TL/DR
字符串文字很特殊,并且由预处理器进行特殊处理。
关于C 文字串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572099/