在连接相邻的字符串文字时


17

C和C ++将相邻的字符串文字编译为单个字符串文字。例如:

"Some text..." "and more text"

等效于:

"Some text...and more text"

在其他C系列语言(如C#或Java)中,这是一种语法错误(顺便说一句很好)。

C和C ++这样做的理由/历史原因是什么?

Answers:


24

最初的C语言是在1969-1972年设计的,当时计算仍由80列打孔卡主导。其设计人员使用了80根色谱柱设备,例如ASR-33 Teletype。这些设备不会自动换行,因此确实有动力将源代码保持在80列之内。在最终转变为自由格式之前,Fortran和Cobol具有明确的延续机制。

丹尼斯·里奇(Dennis Ritchie(我假设))意识到语法没有歧义,并且可以通过使编译器连接相邻文字字符串的简单简便方法,将长ASCII字符串放入80列中,这真是太聪明了。无数的C程序员对此小功能表示感谢。

启用该功能后,为什么还要将其删除?它不会引起悲伤,并且通常很方便。我曾经希望有更多的语言。现代趋势是使用带三引号或其他符号的扩展字符串,但是C中此功能的简单性从未超越。


8
另一个原因是,它允许串联定义为字符串文字的预处理器宏,例如,#define FOO "foo-value"之后跟"FOO's value is " FOO "."
Blrfl 2015年

3
@Blrfl:就是这样。重要的是要认识到字符串连接是在宏替换完成之后发生的。
david.pfx 2015年

7

C没有+像C#和Java这样的特定字符串连接运算符()。在C#或Java中,当编译器看到

"a" + "b"

它可以像编译代码一样

"ab"

是用源代码编写的。但是,在C语言中,没有类似的简单语法来描述编译器可以识别和预先计算的字符串连接。所以几十年前C的设计师选择了

"a" "b"

意味着与

"ab"

自然,C ++继承了相同的约定。虽然C ++标准库重载+std::string,以平均字符串连接时,编译器不会尝试凝聚"a" + "b",因为这实际上是一个错误(您不能添加两个const char *在一起指针)。


1
C也没有特定的字符串类型,而是选择指向内存中字符的指针。您无法添加指针,即使+以某种方式表示串联,您仍然必须解决串联字符串在内存中的位置问题。
Blrfl 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.