C 文字串联

标签 c macros c-preprocessor

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?

几个原因:

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

相关文章:

c - Kill 对信号来说是不安全的尊重 - 还有其他选择吗?

c - 将 C 数组传递给函数

c - 学习集 : How do I place the asterisks and ampersands on function arguments and function calls?

c++ - 定义中的模板函数

c++ - 包含目录中的所有文件?

c# - 我可以使用 C# 预处理器跳过 Kinect v2.0 代码吗?

.net - 是否可以将软件注册为游戏 Controller 设备?

rust - 宏是否可以采用常量表达式和 "inline"来生成有效的 LiteralPattern?

c - #define变量的类型

c - 未使用的宏警告