我在一个开源软件中发现了这种用法,但我不理解它是如何工作的。当我将其输出到stdout时,它显示为“版本0.8.0”。
const char version[] = " version " "0" "." "8" "." "0";
我在一个开源软件中发现了这种用法,但我不理解它是如何工作的。当我将其输出到stdout时,它显示为“版本0.8.0”。
const char version[] = " version " "0" "." "8" "." "0";
这被称为字符串拼接——当你在源代码中将两个(或更多)带引号的字符串放在一起,它们之间没有任何东西时,编译器会将它们组合成一个单独的字符串。这通常用于长字符串——任何超过一行的字符串:
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";
根据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";
等同于:
const char version[] = " version 0.8.0";
编译器将相邻的字符串文字连接起来,使它们成为一个更大的字符串文字。
顺带提一下,const char*
(在您的标题中)与char char[]
(在您发布的代码中)不同。
const char version[] = "version 0.8.0";
编辑:更正为编译器
相邻的字符串文字被连接:
在指定字符串文字时,相邻的字符串被连接。因此,这个声明:
char szStr[] = "12" "34"; 与这个声明相同:
char szStr[] = "1234"; 相邻字符串的连接使得跨越多行指定长字符串变得更加容易:
cout << "Four score and seven years "
"ago, our forefathers brought forth "
"upon this continent a new nation.";
只需将字符串一个接一个地放置,编译时它们就会被连接,因此:
"Hello" ", " "World!" => "Hello, World!"
#define
字符串的:#define FOO "World!"
puts("Hello, " FOO);
编译后将与以下代码相同:
puts("Hello, World!");