我使用的是不是由我寫的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也是如此。 –