首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >const char*初始化

const char*初始化
EN

Stack Overflow用户
提问于 2012-03-27 23:13:04
回答 7查看 6.6K关注 0票数 8

这是我在开源software.And中发现的一个用法,我不理解它是如何工作的。当我将它输出到stdout时,它是“版本0.8.0”。

代码语言:javascript
运行
复制
const char version[] = " version " "0" "." "8" "." "0";
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-27 23:16:03

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

基本上,如果两个字符串之间没有标点符号,那么它们将被合并为一个字符串,如您的输出所示。

在C++98标准中,第2.1节“翻译lex.phases的阶段”中写道:

6相邻的普通字符串文字标记连接在一起。相邻的宽字符串文字标记连接在一起。

这是在预处理器完成之后。

在C99标准中,相应的部分是§5.1.2.1“翻译阶段”,它说:

6相邻的字符串文字标记连接在一起。

您可以使用的任何其他C或C++标准的措辞都将非常相似(我确实认识到C++98和C99都被C++11和C11所取代;我只是还没有最终标准的电子副本)。

票数 7
EN

Stack Overflow用户

发布于 2012-03-27 23:15:52

这称为字符串连接--当您在源代码中将两个(或更多)带引号的字符串放在一起,而它们之间没有任何东西时,编译器会将它们放在一个字符串中。这最常用于长字符串--任何超过一行的字符串:

代码语言:javascript
运行
复制
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的指针数组时,这可能会引起一个小问题。如果您遗漏了一个逗号,编译器就不会警告您--您只会得到一个字符串,其中包含两个单独的字符串。

票数 9
EN

Stack Overflow用户

发布于 2012-03-27 23:16:08

C++标准实现的一部分规定,相邻的字符串文字将连接在一起。

引用自C和C++标准:

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

(C99,6.4.5p5)“在转换阶段6中,由任何相邻字符序列和具有相同前缀的字符串文字标记指定的多字节字符序列将连接成单个多字节字符序列。”

对于C++:

(C++11,2.14.5p13)“在转换阶段6 (2.2)中,相邻的字符串文字连接在一起。”

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9892369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档