2

我使用不是我编写的 ac 代码,并且有很多这样的 fprintf 调用:

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

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

4

4 回答 4

3

这是字符串文字的特性,如果它们相邻,它们将被连接。如果我们查看草案 C99 标准部分6.4.5 字符串文字第 4 段说:

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

正如 Lundin 指出的,可以在5.1.1.2 Translation Phases 第 6 段中找到更简单的引用:

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

于 2013-09-05T14:07:32.373 回答
2

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

这是 C 语法的一个特点:相邻的字符串文字只需将它们连接在一起即可被视为单个文字。

例如,它与预处理器的字符串化支持一起非常有用。

于 2013-09-05T14:04:41.720 回答
0

我会依次回答每个问题。

  • 这是一种串联吗?

你击中了要害。确实是的。

  • 或者这是 fprintf 的一个特性?

不,只是 C 语法的一部分。

  • 如果是这样, fprintf 的规范没有提到它?

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

于 2013-09-05T14:07:27.797 回答
0

在您显示的代码中,只有一种格式代码: "%s". 它接受 mystring 中包含的值,因此结果将是:“blablablabla2_contents of mystring_blabla3”

是的,这是合法代码。我不确定为什么有人会这样做。

于 2013-09-05T14:11:02.380 回答