为什么 printf 函数不能编译?

3

我正在阅读Kernigan和Ritchie关于C语言的手册。

下面是一个例子:

printf("hello, world
");

这本书说明C编译器会生成一个错误信息。编译器如何检测到这个问题,为什么会出现这个问题呢?难道它不能将换行符(大概在world末尾)理解为空格吗?


2
这违反了字面字符串的语言规范,因此编译器应该为编译失败产生一些错误消息。 - nhahtdh
编译器是如何检测到这个的?和它检测任何东西的方式一样。 - Oliver Charlesworth
1
然而,您可以通过在新行之前添加 \ 来创建多行字符串。 - sudowoodo
@CairnO:你可以用这种方式将一个字符串分成多行来编写,但它不会在字符串中插入新行。唯一的方法是使用\n来创建包含换行符的字符串。 - rici
@rici,我想我应该澄清一下,我的意思是在源代码中在换行符之前添加反斜杠,而不是在\n的意义上添加反斜杠。 - sudowoodo
3个回答

6

在字符串字面值中,不允许有换行符。我们可以通过查看C99标准草案6.4.5字符串字面值的语法来证明这一点:

string-literal:
    " s-char-sequenceopt "
    L" s-char-sequenceopt "
s-char-sequence:
    s-char
    s-char-sequence s-char
s-char:
    any member of the source character set except
        the double-quote ", backslash \, or new-line character  

我们可以看到,s-char允许出现任何字符,除了"\换行符

1
编译器检测到错误是因为在找到一个双引号(即匹配开头的双引号)之前,它发现了一个换行符\n(即在world中的d右边)。它这样做是因为,正如其他评论者所说,规范要求它这样做。

1

在参数中有"\n"。在编写printf()的参数时,永远不要按下回车键 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接