C++ 常量字符*初始化

C++ 常量字符*初始化,c++,C++,这是我在开源软件中发现的一种用法,我不知道它是如何工作的。 当我把它输出到标准输出时,它是“版本0.8.0” 同: const char version[] = " version 0.8.0"; 编译器将相邻的字符串文字连接起来,形成一个更大的字符串文字 作为旁注,const char*(在您的标题中)与char char[](在您发布的代码中)不同。这称为字符串连接——当您在源代码中相邻放置两个(或更多)带引号的字符串时,编译器会将它们组合成一个字符串。这通常用于长字符串——任何超过一行的

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

同:

const char version[] = " version 0.8.0";
编译器将相邻的字符串文字连接起来,形成一个更大的字符串文字


作为旁注,
const char*
(在您的标题中)与
char char[]
(在您发布的代码中)不同。

这称为字符串连接——当您在源代码中相邻放置两个(或更多)带引号的字符串时,编译器会将它们组合成一个字符串。这通常用于长字符串——任何超过一行的字符串:

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的指针数组时,这可能会导致一个小问题。如果你漏掉一个逗号,编译器不会警告你——你只会得到一个字符串,其中包含两个单独的字符串。

这是C89和C++98的一个基本特性,称为“相邻字符串连接”或类似的特性

基本上,如果两个字符串文本彼此相邻,中间没有标点符号,它们将合并为单个字符串,如输出所示


在C++98标准中,第§2.1节“翻译阶段[法律阶段]”规定:

连接6个相邻的普通字符串文字标记。相邻的宽字符串文字标记被连接起来

这是在预处理器完成之后

在C99标准中,相应的章节为§5.1.2.1“翻译阶段”,其中规定:

连接6个相邻的字符串文字标记


在任何其他C或C++标准中,你可以很容易地掌握(我认识到C++ 98和C99都被C++ 11和C11取代,我只是没有最终标准的电子拷贝)。

< P>部分C++标准实现声明,彼此相邻的字符串文字将被串在一起。 < > >强引用> C和C++标准:< /强>

对于C(引用C99,但C11与6.4.5p5中的内容类似):

(C99,6.4.5p5)“在翻译阶段6,多字节字符 由任何相邻字符序列指定的序列,以及 前缀相同的字符串文字标记连接到 单多字节字符序列。“

对于C++:

(C++11,2.14.5p13)“在翻译阶段6(2.2),相邻字符串 文字是串联的。”


编译器会自动连接彼此之后写入的字符串文字(仅用空格分隔)。。就好像你写过一样

const char version[] = "version 0.8.0";

编辑:将预处理器更正为编译器

相邻字符串文字为:

指定字符串文字时,相邻字符串将连接在一起。 因此,本宣言:

char szStr[]=“12”“34”;与本声明相同:

char szStr[]=“1234”;这种相邻字符串的串联使 易于跨多行指定长字符串:


cout只需在编译时将字符串一个接一个地连接起来,因此:

"Hello" ", " "World!" => "Hello, World!"
这是该功能的一种奇怪用法,通常是允许使用
#define
字符串:

#define FOO "World!"

puts("Hello, " FOO);
将编译为以下内容:

puts("Hello, World!");
#define FOO "World!"

puts("Hello, " FOO);
puts("Hello, World!");