我使用的是不是由我写的ac代码,而且有很多fprintf调用是这样的:c:“...”“...”中的字符串,好像它们连接在一起
fprintf(file, "blabla1""blabla2%s""blabla3", mystring);
我从来没有见过我们可以在fprintf的第二个参数中放入几个字符串,这是一种串联吗?或者这是fprintf的一个特性?如果是这样,fprintf的规格没有提到它?
我使用的是不是由我写的ac代码,而且有很多fprintf调用是这样的:c:“...”“...”中的字符串,好像它们连接在一起
fprintf(file, "blabla1""blabla2%s""blabla3", mystring);
我从来没有见过我们可以在fprintf的第二个参数中放入几个字符串,这是一种串联吗?或者这是fprintf的一个特性?如果是这样,fprintf的规格没有提到它?
不,这不是fprintf()
的功能,那是不可能的(你自己怎么实现这样的功能?),因为fprintf()
只是一个标准函数,编译器不需要额外的魔法。
这是C语法的一个特性:相邻字符串文字通过将它们连接在一起而被视为单个文字。
例如,它与preprocessor's stringification support一起非常有用。
我会依次回答每个问题。
你撞到了头上。确实是的。
不,只是C语法的一部分。
也就是说,实际上不是一个问题,尽管标点符号,但你可能是正确的,因为fprintf中规范没有提及这种类型的级联的,那是因为它是因为它是语言的一部分,而不是具体功能。
这是字符串文字的特征,如果它们相邻,它们将被连接。如果我们看一下draft C99 standard部6.4.5
字符串文字段落4说:
在翻译阶段6,通过 相邻的字符和宽字符串文字记号的任何序列中指定的多字节字符序列被连接成一个单一的多字节 字符序列。如果任何令牌都是宽字符串文字标记,则生成的 多字节字符序列将被视为宽字符串文字;否则,它被视为字符串文字。
由于伦丁指出一个简单的报价可以在一节中找到5.1.1.2
平移阶段第6段:
相邻字符串文字令牌是连接在一起。
在您显示的代码中,只有一个格式代码:"%s"
。它接受mystring中包含的值,因此结果将为:“mystring_blabla3的blablablabla2_contents”
是的,这是合法代码。我不确定为什么有人会这样做。
“翻译阶段6”位于C11 5.1.1.2/6:“相邻的字符串文字标记被连接在一起。”# – Lundin
@Lundin Huh,这是一个更直接的引用,谢谢指出它, C99也是如此。 –