当换行符分隔时,字符串文字是否必然被认为是相邻的(并因此连接在一起)?

时间:2011-08-26 11:23:58

标签: c c99

我相信这是一个迂腐的问题。然而,由于常见问题解答似乎不允许迂腐,我会继续问,因为我真的对答案感兴趣。

我正在尝试阅读并理解(大部分)C99标准(ISO / IEC 9899:1999)。我基本上想知道这是否严格符合代码:

printf("String literal 1 "
"String literal 2.\n");

或者换行符应该像这样转义:

printf("String literal 1 "\
"String literal 2.\n");

标准的相关部分似乎是第5.1.1.2节,其中描述了翻译阶段。在阶段2中,删除每个“\”后跟换行符,将行拼接成一行。然后在阶段6中,连接相邻的字符串文字标记。

因此,对于要符合的第一个代码示例,我看到两个选项:由换行符分隔的字符串文字被认为是相邻的,或者在之前的一个转换阶段中删除了换行符。

所以有人知道上面的第一个代码示例是否可以在这种情况下被认为是严格符合的,如果是这样的话,标准中的某些内容会使这一点绝对清楚吗?

4 个答案:

答案 0 :(得分:2)

是的,换行符只是空格。所以你的第一个例子相当于

printf("String literal 1 " "String literal 2.\n");

答案 1 :(得分:2)

我相信他们都严格遵守。 \是一个与字符串文字串联不同的特性。所以你的第一个例子绝对没问题:文字之间有一个新的线条字符,这是一个白色空间,因此形成了一个“序列 空白字符“如5.1.1.3中所述。

5.1.1.2中的C标准对于\有点不清楚,因为它模糊地暗示新行字符被删除以及反斜杠。但在这种特殊情况下,字符串文字之间是否有空白字符无关紧要,我相信你的第一个例子将被解释为

“String literal 1”“String literal 2. \ n”

反过来导致预期的输出。

答案 2 :(得分:1)

我不能用标准的段落证明它,但两种选择是等价的。

换行符不是字符串的一部分,因此不会影响它们。

答案 3 :(得分:1)

正式回答你的上一个问题,是的,你指的是标准中的正确段落。

现在,为什么不在第二个代码片段中使用反斜杠?这没用!

反斜杠+ EOL仅在极少数情况下相关,例如:在几行上定义一个宏同时保持一个明确的缩进(我不能想到任何其他情况)。你实际上可以在所有行的末尾添加反斜杠,如果你使用正常的缩进,它将编译没有问题。你甚至可以在文件的所有字符之间加上反斜杠+ EOL! printf("...");这样完全有效:

p\
r\
in\
t\
f\
("..\
.")\
;`