C文字连接

时间:2015-09-14 19:06:42

标签: c macros c-preprocessor

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;

但同样不会反映变量。 为什么会这样?

2 个答案:

答案 0 :(得分:1)

宏和初始化列表都不对您观察的内容负责。

当C在源代码中找到彼此相邻的两个文字时,它会将它们连接起来。因此,"hello" "world"与键入"helloworld"相同。

答案 1 :(得分:1)

  

但同样没有反映变量。为什么会这样?

有几个原因:

  1. 字符串连接由预处理器解析源文本之前完成(这是可能的,因为字符串文字具有"分隔符,这使得它们在此级别易于识别); < / LI>
  2. 有一个明确定义的初始化语法,它根本不允许初始化,如char E[] = B C D;;
  3. 同样,表达式 BCD将转换为指针表达式,不会被视为char的数组; < / LI>

    此外,并非所有char数组都保证存储字符串。而且你必须为连接的字符串留出存储空间。

      

    标准对此有何评价?

    C程序分为8个不同的阶段(详见C 2011 Standard的第5.1.1.2节)。

    阶段1到6描述了预处理器的动作;物理源文件字符映射到源字符集,三字符转换为单字符等价物,带有尾随\字符的物理行拼接成单个逻辑源行,注释替换为单个空白字符,扩展宏,执行预处理指令,并且,作为预处理器的最后一步,串联字符串文字。

    第7阶段是编译器实际解析按摩源文本的位置。

    第8阶段基本上是链接器步骤。

    <强> TL / DR

    字符串文字是特殊的,并由预处理器专门处理。

相关问题