c中一个接一个的字符串:“quot&引用&引用&引用;,就好像它们是连在一起的

c中一个接一个的字符串:“quot&引用&引用&引用;,就好像它们是连在一起的,c,string,concatenation,printf,C,String,Concatenation,Printf,我使用的c代码不是我自己编写的,有很多fprintf调用如下: fprintf(file, "blabla1""blabla2%s""blabla3", mystring); 我从未见过我们可以在fprintf的第二个参数中放入几个字符串,这是一种串联吗?或者这是fprintf的一个功能?如果是这样,fprintf的规范没有提到它?不,这不是fprintf()的一个特性,这是不可能的(您自己如何实现这样一个函数?),因为fprintf()只是一个标准函数,编译器没有额外的魔法 这是C语言语法的

我使用的c代码不是我自己编写的,有很多fprintf调用如下:

fprintf(file, "blabla1""blabla2%s""blabla3", mystring);

我从未见过我们可以在fprintf的第二个参数中放入几个字符串,这是一种串联吗?或者这是fprintf的一个功能?如果是这样,fprintf的规范没有提到它?

不,这不是
fprintf()
的一个特性,这是不可能的(您自己如何实现这样一个函数?),因为
fprintf()
只是一个标准函数,编译器没有额外的魔法

这是C语言语法的一个特点:相邻的字符串文字被当作一个单独的文字处理,只需将它们连接在一起


举例来说,它和一起非常有用。

我将依次回答每个问题

  • 这是一种连接吗
你一针见血。是的

  • 或者这是fprintf的一个功能
不,只是C语法的一部分

  • 如果是,fprintf的规范中没有提到它

这实际上不是一个问题,尽管有标点符号,但您可能是正确的,fprintf规范没有提到这种类型的连接,这是因为它是语言的一部分,而不是特定的函数。

这是字符串文字的特征,如果它们相邻,它们将被合并。如果我们看一下
6.4.5节
String literals,第4段说:

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

正如Lundin指出的,一个更简单的引用可以在第6段翻译阶段的
5.1.1.2节中找到:

相邻的字符串文字标记被连接起来


在您显示的代码中,只有一个格式代码:
“%s”
。它接受mystring中包含的值,因此结果将是:“blablabla2_mystring_bla3的内容”


是的,这是法律法规。我不知道为什么会有人这样做。

在C115.1.1.2/6中找到了“翻译阶段6”:
相邻的字符串文字标记被连接起来。
@Lundin-Huh,这是一个更直接的引语,感谢您指出,同样的引语也存在于C99中。