这是我在开源软件中发现的一种用法。我不明白它是如何工作的。 当我把它输出到标准输出时,它是“版本0.8.0”。
const char version[] = " version " "0" "." "8" "." "0";
答案 0 :(得分:9)
它被称为字符串连接 - 当您在源代码中将两个(或更多)引用的字符串彼此相邻而它们之间没有任何内容时,编译器将它们组合成一个字符串。这通常用于长字符串 - 任何超过一行的长度:
char whatever[] = "this is the first line of the string\n"
"this is the second line of the string\n"
"This is the third line of the string";
在字符串连接被发明之前,你必须用一个相当笨拙的续行来做到这一点,在每一行的末尾添加一个反斜杠(并确保它是结束,因为大多数编译器不会将它视为行继续如果反斜杠之后有任何空格)。抛出缩进也是丑陋的,因为后续行开头的任何空格都可能包含在字符串中。
如果您打算在字符串之间添加逗号,例如初始化指向char的指针数组时,这可能会导致一个小问题。如果您错过了逗号,编译器将不会向您发出警告 - 您只需获得一个字符串,其中包含两个独立的字符串。
答案 1 :(得分:7)
这是C89和C ++ 98的基本功能,称为“相邻字符串连接”或其附近。
基本上,如果两个字符串文字彼此相邻且中间没有标点符号,则它们将合并为单个字符串,如输出所示。
在C ++ 98标准中,第2.1节“翻译阶段[lex.phases]”说:
6连接相邻的普通字符串文字标记。相邻的宽字符串文字标记是连接在一起的。
这是在预处理器完成之后。
在C99标准中,相应的部分是§5.1.2.1“翻译阶段”,它说:
6连接相邻的字符串文字标记。
在你可以掌握的任何其他C或C ++标准中,措辞非常相似(我确实认识到C ++ 98和C99都被C ++ 11和C11取代;我只是没有最终标准的电子副本,但)。
答案 2 :(得分:6)
C ++标准实现的一部分规定,彼此相邻的字符串文字将连接在一起。
来自C和C ++标准的引言:
对于C(引用C99,但C11在6.4.5p5中有相似之处):
(C99,6.4.5p5)“在翻译阶段6,多字节字符 由相邻字符和任何序列指定的序列 带有相同前缀的字符串文字标记连接成一个 单个多字节字符序列。“
对于C ++:
(C ++ 11,2.14.5p13)“在翻译阶段6(2.2)中,相邻的字符串 文字被连接起来。“
答案 3 :(得分:3)
const char version[] = " version " "0" "." "8" "." "0";
与:
相同const char version[] = " version 0.8.0";
编译器连接相邻的字符串文字,使一个更大的字符串文字。
作为旁注,const char*
(在您的标题中)与char char[]
(在您发布的代码中)不同。
答案 4 :(得分:2)
编译器自动连接彼此写入的字符串文字(仅由空格分隔)。就好像你已经写好了
const char version[] = "version 0.8.0";
编辑:将预处理器更正为编译器
答案 5 :(得分:2)
相邻的字符串文字为concatenated:
指定字符串文字时,会连接相邻的字符串。 因此,这个声明:
char szStr [] =“12”“34”;与此声明相同:
char szStr [] =“1234”;相邻字符串的这种连接使它成为可能 容易在多行中指定长字符串:
cout<< “四分七年” “以前,我们的祖先提出了” “在这个大陆上成为一个新国家。”
答案 6 :(得分:0)
简单地在编译时将字符串一个接一个地连接起来,所以:
"Hello" ", " "World!" => "Hello, World!"
这是该功能的一种奇怪用法,通常是允许使用#define
字符串:
#define FOO "World!"
puts("Hello, " FOO);
将编译为:
puts("Hello, World!");