【问题标题】:printf("string1""string2") is this valid C?printf("string1""string2") 这是有效的 C 吗?
【发布时间】:2011-05-23 11:27:38
【问题描述】:

当我写错了这篇文章时,我正试图弄清楚一些事情

printf("string1""string2");

令我惊讶的是,它编译并产生了一个串联的字符串输出,即

string1string2

这是有效的 C 吗?

我正在使用 gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

【问题讨论】:

    标签: c string standards-compliance


    【解决方案1】:

    是的。连续的字符串字面量在 C 解析的早期就被连接起来。

    6.4.5 / 4:

    在翻译阶段 6,由任何相邻字符序列和宽字符串文字标记指定的多字节字符序列连接成单个多字节字符序列。如果任何标记是宽字符串文字标记,则生成的多字节字符序列将被视为宽字符串文字;否则,将其视为字符串文字。

    【讨论】:

      【解决方案2】:

      是的,在编译时连接字符串常量非常有用。

      #define VERSION "1.0"
      #define COMPANY "Trivial Software"
      
      printf("hello world: v. " VERSION " copyright (c) " COMPANY);
      

      puts(
        "blah blah blah\n"
        "blah blah blah\n"
        "blah blah blah\n"
        "blah blah blah\n"
      );
      

      【讨论】:

        【解决方案3】:

        是的,它是有效的,并且已经成为 C 语言的一部分很长时间(如果不是从一开始)。连接是在编译时完成的。

        【讨论】:

          【解决方案4】:

          正如其他人所说,是的,它是有效的。我只想补充一点,输入填充多行的长字符串非常有用。您不必乱用\ 来指示字符串继续,也不想添加回车,所以您只需编写:

          "very long string "
          "that continues over here"
          

          (注意每个字符串末尾的空格,这是一个常见的错误。在这种情况下,“string”和“that”将是联合的。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-09
            • 2012-12-08
            • 2014-01-08
            • 2016-07-26
            • 1970-01-01
            相关资源
            最近更新 更多