printf("string1""string2")这种写法在C语言中合法吗?

4

我在尝试解决一个问题时,不小心写了这个

printf("string1""string2");

令我惊讶的是,它编译并产生了一个连接字符串输出,即:
string1string2

这段代码符合C语言规范吗?

我正在使用gcc 版本4.4.1(Ubuntu 4.4.1-4ubuntu9)

4个回答

8

是的,它是这样的。在 C 解析的早期阶段,相邻的字符串字面量被连结在一起。

来自 6.4.5 / 4:

在第 6 阶段的翻译中,由任意相邻的字符和宽字符串字面量记号指定的多字节字符序列被连接成单个多字节字符序列。如果其中任何一个记号是宽字符串记号,则生成的多字节字符序列将被视为宽字符串字面量;否则,它将被视为字符字符串字面量。


3
是的,将字符串常量在编译时连接起来非常有用。
#define VERSION "1.0"
#define COMPANY "Trivial Software"

printf("hello world: v. " VERSION " copyright (c) " COMPANY);

或者

puts(
  "blah blah blah\n"
  "blah blah blah\n"
  "blah blah blah\n"
  "blah blah blah\n"
);

2
是的,这是有效的,并且自 C 语言诞生以来就一直存在。连接在编译时完成。

1

就像其他人说的一样,是的,它是有效的。我只想补充一点,输入填满几行的长字符串非常有用。您不必使用\来指示字符串继续,也不需要添加回车符,所以您只需编写:

"very long string "
"that continues over here"

(注意每个字符串末尾的空格,这是一个常见错误。在这种情况下,“string”和“that”将被连接。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接