const char *初始化

时间:2012-03-27 15:13:04

标签: c++

这是我在开源软件中发现的一种用法。我不明白它是如何工作的。 当我把它输出到标准输出时,它是“版本0.8.0”。

const char version[] = " version " "0" "." "8" "." "0";

7 个答案:

答案 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!");